@remnux/mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +720 -0
- package/dist/archive-extractor.d.ts +46 -0
- package/dist/archive-extractor.d.ts.map +1 -0
- package/dist/archive-extractor.js +268 -0
- package/dist/archive-extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +40 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +114 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +154 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/archive-passwords.txt +3 -0
- package/dist/connectors/docker.d.ts +13 -0
- package/dist/connectors/docker.d.ts.map +1 -0
- package/dist/connectors/docker.js +201 -0
- package/dist/connectors/docker.js.map +1 -0
- package/dist/connectors/index.d.ts +27 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +23 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/local.d.ts +10 -0
- package/dist/connectors/local.d.ts.map +1 -0
- package/dist/connectors/local.js +105 -0
- package/dist/connectors/local.js.map +1 -0
- package/dist/connectors/ssh.d.ts +21 -0
- package/dist/connectors/ssh.d.ts.map +1 -0
- package/dist/connectors/ssh.js +237 -0
- package/dist/connectors/ssh.js.map +1 -0
- package/dist/errors/error-mapper.d.ts +9 -0
- package/dist/errors/error-mapper.d.ts.map +1 -0
- package/dist/errors/error-mapper.js +24 -0
- package/dist/errors/error-mapper.js.map +1 -0
- package/dist/errors/remnux-error.d.ts +14 -0
- package/dist/errors/remnux-error.d.ts.map +1 -0
- package/dist/errors/remnux-error.js +19 -0
- package/dist/errors/remnux-error.js.map +1 -0
- package/dist/file-type-mappings.d.ts +30 -0
- package/dist/file-type-mappings.d.ts.map +1 -0
- package/dist/file-type-mappings.js +136 -0
- package/dist/file-type-mappings.js.map +1 -0
- package/dist/file-upload.d.ts +44 -0
- package/dist/file-upload.d.ts.map +1 -0
- package/dist/file-upload.js +170 -0
- package/dist/file-upload.js.map +1 -0
- package/dist/handlers/analyze-file.d.ts +10 -0
- package/dist/handlers/analyze-file.d.ts.map +1 -0
- package/dist/handlers/analyze-file.js +149 -0
- package/dist/handlers/analyze-file.js.map +1 -0
- package/dist/handlers/check-tools.d.ts +9 -0
- package/dist/handlers/check-tools.d.ts.map +1 -0
- package/dist/handlers/check-tools.js +47 -0
- package/dist/handlers/check-tools.js.map +1 -0
- package/dist/handlers/download-file.d.ts +10 -0
- package/dist/handlers/download-file.d.ts.map +1 -0
- package/dist/handlers/download-file.js +113 -0
- package/dist/handlers/download-file.js.map +1 -0
- package/dist/handlers/download-from-url.d.ts +30 -0
- package/dist/handlers/download-from-url.d.ts.map +1 -0
- package/dist/handlers/download-from-url.js +295 -0
- package/dist/handlers/download-from-url.js.map +1 -0
- package/dist/handlers/extract-archive.d.ts +10 -0
- package/dist/handlers/extract-archive.d.ts.map +1 -0
- package/dist/handlers/extract-archive.js +57 -0
- package/dist/handlers/extract-archive.js.map +1 -0
- package/dist/handlers/extract-iocs.d.ts +10 -0
- package/dist/handlers/extract-iocs.d.ts.map +1 -0
- package/dist/handlers/extract-iocs.js +21 -0
- package/dist/handlers/extract-iocs.js.map +1 -0
- package/dist/handlers/get-file-info.d.ts +10 -0
- package/dist/handlers/get-file-info.d.ts.map +1 -0
- package/dist/handlers/get-file-info.js +89 -0
- package/dist/handlers/get-file-info.js.map +1 -0
- package/dist/handlers/list-files.d.ts +10 -0
- package/dist/handlers/list-files.d.ts.map +1 -0
- package/dist/handlers/list-files.js +60 -0
- package/dist/handlers/list-files.js.map +1 -0
- package/dist/handlers/run-tool.d.ts +10 -0
- package/dist/handlers/run-tool.d.ts.map +1 -0
- package/dist/handlers/run-tool.js +99 -0
- package/dist/handlers/run-tool.js.map +1 -0
- package/dist/handlers/suggest-tools.d.ts +10 -0
- package/dist/handlers/suggest-tools.d.ts.map +1 -0
- package/dist/handlers/suggest-tools.js +202 -0
- package/dist/handlers/suggest-tools.js.map +1 -0
- package/dist/handlers/types.d.ts +15 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +2 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/handlers/upload-file.d.ts +10 -0
- package/dist/handlers/upload-file.d.ts.map +1 -0
- package/dist/handlers/upload-file.js +33 -0
- package/dist/handlers/upload-file.js.map +1 -0
- package/dist/handlers/upload-from-host.d.ts +10 -0
- package/dist/handlers/upload-from-host.d.ts.map +1 -0
- package/dist/handlers/upload-from-host.js +33 -0
- package/dist/handlers/upload-from-host.js.map +1 -0
- package/dist/handlers/upload-sample.d.ts +10 -0
- package/dist/handlers/upload-sample.d.ts.map +1 -0
- package/dist/handlers/upload-sample.js +26 -0
- package/dist/handlers/upload-sample.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/ioc/extractor.d.ts +21 -0
- package/dist/ioc/extractor.d.ts.map +1 -0
- package/dist/ioc/extractor.js +91 -0
- package/dist/ioc/extractor.js.map +1 -0
- package/dist/ioc/known-values.d.ts +7 -0
- package/dist/ioc/known-values.d.ts.map +1 -0
- package/dist/ioc/known-values.js +43 -0
- package/dist/ioc/known-values.js.map +1 -0
- package/dist/ioc/noise.d.ts +6 -0
- package/dist/ioc/noise.d.ts.map +1 -0
- package/dist/ioc/noise.js +170 -0
- package/dist/ioc/noise.js.map +1 -0
- package/dist/ioc/patterns.d.ts +10 -0
- package/dist/ioc/patterns.d.ts.map +1 -0
- package/dist/ioc/patterns.js +65 -0
- package/dist/ioc/patterns.js.map +1 -0
- package/dist/ioc/scoring.d.ts +6 -0
- package/dist/ioc/scoring.d.ts.map +1 -0
- package/dist/ioc/scoring.js +69 -0
- package/dist/ioc/scoring.js.map +1 -0
- package/dist/parsers/capa.d.ts +9 -0
- package/dist/parsers/capa.d.ts.map +1 -0
- package/dist/parsers/capa.js +55 -0
- package/dist/parsers/capa.js.map +1 -0
- package/dist/parsers/diec.d.ts +9 -0
- package/dist/parsers/diec.d.ts.map +1 -0
- package/dist/parsers/diec.js +53 -0
- package/dist/parsers/diec.js.map +1 -0
- package/dist/parsers/floss.d.ts +14 -0
- package/dist/parsers/floss.d.ts.map +1 -0
- package/dist/parsers/floss.js +89 -0
- package/dist/parsers/floss.js.map +1 -0
- package/dist/parsers/index.d.ts +16 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +46 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/oleid.d.ts +8 -0
- package/dist/parsers/oleid.d.ts.map +1 -0
- package/dist/parsers/oleid.js +94 -0
- package/dist/parsers/oleid.js.map +1 -0
- package/dist/parsers/olevba.d.ts +8 -0
- package/dist/parsers/olevba.d.ts.map +1 -0
- package/dist/parsers/olevba.js +83 -0
- package/dist/parsers/olevba.js.map +1 -0
- package/dist/parsers/passthrough.d.ts +6 -0
- package/dist/parsers/passthrough.d.ts.map +1 -0
- package/dist/parsers/passthrough.js +13 -0
- package/dist/parsers/passthrough.js.map +1 -0
- package/dist/parsers/pdf-parser.d.ts +9 -0
- package/dist/parsers/pdf-parser.d.ts.map +1 -0
- package/dist/parsers/pdf-parser.js +76 -0
- package/dist/parsers/pdf-parser.js.map +1 -0
- package/dist/parsers/pdfid.d.ts +9 -0
- package/dist/parsers/pdfid.d.ts.map +1 -0
- package/dist/parsers/pdfid.js +56 -0
- package/dist/parsers/pdfid.js.map +1 -0
- package/dist/parsers/peframe.d.ts +8 -0
- package/dist/parsers/peframe.d.ts.map +1 -0
- package/dist/parsers/peframe.js +76 -0
- package/dist/parsers/peframe.js.map +1 -0
- package/dist/parsers/readelf.d.ts +8 -0
- package/dist/parsers/readelf.d.ts.map +1 -0
- package/dist/parsers/readelf.js +50 -0
- package/dist/parsers/readelf.js.map +1 -0
- package/dist/parsers/types.d.ts +30 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +5 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/parsers/yara.d.ts +8 -0
- package/dist/parsers/yara.d.ts.map +1 -0
- package/dist/parsers/yara.js +88 -0
- package/dist/parsers/yara.js.map +1 -0
- package/dist/response.d.ts +44 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +48 -0
- package/dist/response.js.map +1 -0
- package/dist/schemas/tools.d.ts +135 -0
- package/dist/schemas/tools.d.ts.map +1 -0
- package/dist/schemas/tools.js +53 -0
- package/dist/schemas/tools.js.map +1 -0
- package/dist/security/blocklist.d.ts +69 -0
- package/dist/security/blocklist.d.ts.map +1 -0
- package/dist/security/blocklist.js +148 -0
- package/dist/security/blocklist.js.map +1 -0
- package/dist/state/session.d.ts +35 -0
- package/dist/state/session.d.ts.map +1 -0
- package/dist/state/session.js +45 -0
- package/dist/state/session.js.map +1 -0
- package/dist/tools/definitions.d.ts +9 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +708 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/invoker.d.ts +17 -0
- package/dist/tools/invoker.d.ts.map +1 -0
- package/dist/tools/invoker.js +44 -0
- package/dist/tools/invoker.js.map +1 -0
- package/dist/tools/registry.d.ts +62 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +53 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/workflows/engine.d.ts +27 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +224 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/loader.d.ts +33 -0
- package/dist/workflows/loader.d.ts.map +1 -0
- package/dist/workflows/loader.js +130 -0
- package/dist/workflows/loader.js.map +1 -0
- package/dist/workflows/types.d.ts +109 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +5 -0
- package/dist/workflows/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Loader — load and validate YAML workflow definitions.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, existsSync } from "node:fs";
|
|
5
|
+
import { join, extname } from "node:path";
|
|
6
|
+
import yaml from "js-yaml";
|
|
7
|
+
/**
|
|
8
|
+
* Validate a parsed workflow definition has required fields.
|
|
9
|
+
* Returns an array of validation error messages (empty = valid).
|
|
10
|
+
*/
|
|
11
|
+
export function validateWorkflow(def) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
if (!def || typeof def !== "object") {
|
|
14
|
+
return ["Workflow must be an object"];
|
|
15
|
+
}
|
|
16
|
+
const w = def;
|
|
17
|
+
if (typeof w.name !== "string" || !w.name) {
|
|
18
|
+
errors.push("Missing required field: name");
|
|
19
|
+
}
|
|
20
|
+
if (typeof w.description !== "string" || !w.description) {
|
|
21
|
+
errors.push("Missing required field: description");
|
|
22
|
+
}
|
|
23
|
+
if (typeof w.version !== "string" || !w.version) {
|
|
24
|
+
errors.push("Missing required field: version");
|
|
25
|
+
}
|
|
26
|
+
// Triggers
|
|
27
|
+
if (!w.triggers || typeof w.triggers !== "object") {
|
|
28
|
+
errors.push("Missing required field: triggers");
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const triggers = w.triggers;
|
|
32
|
+
if (!Array.isArray(triggers.file_types) || triggers.file_types.length === 0) {
|
|
33
|
+
errors.push("triggers.file_types must be a non-empty array");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Steps
|
|
37
|
+
if (!Array.isArray(w.steps) || w.steps.length === 0) {
|
|
38
|
+
errors.push("steps must be a non-empty array");
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const stepNames = new Set();
|
|
42
|
+
for (let i = 0; i < w.steps.length; i++) {
|
|
43
|
+
const step = w.steps[i];
|
|
44
|
+
if (!step || typeof step !== "object") {
|
|
45
|
+
errors.push(`steps[${i}] must be an object`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (typeof step.name !== "string" || !step.name) {
|
|
49
|
+
errors.push(`steps[${i}] missing required field: name`);
|
|
50
|
+
}
|
|
51
|
+
else if (stepNames.has(step.name)) {
|
|
52
|
+
errors.push(`steps[${i}] duplicate step name: ${step.name}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
stepNames.add(step.name);
|
|
56
|
+
}
|
|
57
|
+
if (typeof step.tool !== "string" || !step.tool) {
|
|
58
|
+
errors.push(`steps[${i}] missing required field: tool`);
|
|
59
|
+
}
|
|
60
|
+
if (step.on_error && !["continue", "abort", "retry"].includes(step.on_error)) {
|
|
61
|
+
errors.push(`steps[${i}].on_error must be one of: continue, abort, retry`);
|
|
62
|
+
}
|
|
63
|
+
if (step.depth && !["quick", "standard", "deep"].includes(step.depth)) {
|
|
64
|
+
errors.push(`steps[${i}].depth must be one of: quick, standard, deep`);
|
|
65
|
+
}
|
|
66
|
+
if (step.retries !== undefined) {
|
|
67
|
+
if (typeof step.retries !== "number" || !Number.isInteger(step.retries) || step.retries < 1) {
|
|
68
|
+
errors.push(`steps[${i}].retries must be a positive integer`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (step.retry_delay !== undefined) {
|
|
72
|
+
if (typeof step.retry_delay !== "number" || step.retry_delay < 0) {
|
|
73
|
+
errors.push(`steps[${i}].retry_delay must be a non-negative number`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return errors;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Load a single workflow YAML file. Throws on parse or validation errors.
|
|
82
|
+
*/
|
|
83
|
+
export function loadWorkflowFile(filePath) {
|
|
84
|
+
const content = readFileSync(filePath, "utf-8");
|
|
85
|
+
const parsed = yaml.load(content);
|
|
86
|
+
const errors = validateWorkflow(parsed);
|
|
87
|
+
if (errors.length > 0) {
|
|
88
|
+
throw new Error(`Invalid workflow ${filePath}:\n ${errors.join("\n ")}`);
|
|
89
|
+
}
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Load all workflow YAML files from a directory.
|
|
94
|
+
* Returns loaded workflows and any errors encountered.
|
|
95
|
+
*/
|
|
96
|
+
export function loadWorkflowDirectory(dirPath) {
|
|
97
|
+
const workflows = [];
|
|
98
|
+
const errors = [];
|
|
99
|
+
if (!existsSync(dirPath)) {
|
|
100
|
+
return { workflows, errors };
|
|
101
|
+
}
|
|
102
|
+
const files = readdirSync(dirPath).filter((f) => extname(f) === ".yaml" || extname(f) === ".yml");
|
|
103
|
+
for (const file of files) {
|
|
104
|
+
try {
|
|
105
|
+
const workflow = loadWorkflowFile(join(dirPath, file));
|
|
106
|
+
workflows.push(workflow);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
errors.push({
|
|
110
|
+
file,
|
|
111
|
+
error: err instanceof Error ? err.message : String(err),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return { workflows, errors };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Find a workflow matching a file type category name.
|
|
119
|
+
*/
|
|
120
|
+
export function findWorkflowForCategory(workflows, categoryName) {
|
|
121
|
+
return workflows.find((w) => w.triggers.categories?.includes(categoryName));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Find a workflow matching a MIME type or file extension.
|
|
125
|
+
*/
|
|
126
|
+
export function findWorkflowForFileType(workflows, fileType) {
|
|
127
|
+
const lower = fileType.toLowerCase();
|
|
128
|
+
return workflows.find((w) => w.triggers.file_types.some((t) => lower.includes(t.toLowerCase())));
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/workflows/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow definition types for declarative analysis workflows.
|
|
3
|
+
*/
|
|
4
|
+
import type { DepthTier } from "../file-type-mappings.js";
|
|
5
|
+
/** What to do when a step fails. */
|
|
6
|
+
export type OnError = "continue" | "abort" | "retry";
|
|
7
|
+
/** A condition expression evaluated against previous step results. */
|
|
8
|
+
export interface StepCondition {
|
|
9
|
+
/** Simple expression: "depth in ['standard', 'deep']" or "pdfid.js_count > 0" */
|
|
10
|
+
expr: string;
|
|
11
|
+
}
|
|
12
|
+
/** A single step in a workflow. */
|
|
13
|
+
export interface WorkflowStep {
|
|
14
|
+
/** Step identifier (unique within workflow) */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Tool name (must exist in tool registry or file-type-mappings) */
|
|
17
|
+
tool: string;
|
|
18
|
+
/** Arguments passed to the tool (supports {input_file} and {step_name.field} interpolation) */
|
|
19
|
+
args?: string[];
|
|
20
|
+
/** Condition that must be true for this step to run */
|
|
21
|
+
condition?: string;
|
|
22
|
+
/** Error handling behavior (default: "continue") */
|
|
23
|
+
on_error?: OnError;
|
|
24
|
+
/** Per-step timeout in seconds (overrides tool default) */
|
|
25
|
+
timeout?: number;
|
|
26
|
+
/** Minimum depth tier for this step (default: "standard") */
|
|
27
|
+
depth?: DepthTier;
|
|
28
|
+
/** Max retry attempts when on_error is "retry" (default: 2) */
|
|
29
|
+
retries?: number;
|
|
30
|
+
/** Delay between retries in seconds (default: 1) */
|
|
31
|
+
retry_delay?: number;
|
|
32
|
+
}
|
|
33
|
+
/** Workflow trigger — when this workflow should be selected. */
|
|
34
|
+
export interface WorkflowTrigger {
|
|
35
|
+
/** MIME types or file extensions that trigger this workflow */
|
|
36
|
+
file_types: string[];
|
|
37
|
+
/** Category names from file-type-mappings (e.g., "PE", "PDF") */
|
|
38
|
+
categories?: string[];
|
|
39
|
+
}
|
|
40
|
+
/** Workflow parameter definition. */
|
|
41
|
+
export interface WorkflowParameter {
|
|
42
|
+
type: "enum" | "boolean" | "string" | "number";
|
|
43
|
+
values?: string[];
|
|
44
|
+
default?: unknown;
|
|
45
|
+
description?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Output section definition. */
|
|
48
|
+
export interface OutputSection {
|
|
49
|
+
name: string;
|
|
50
|
+
fields?: string[];
|
|
51
|
+
source?: string;
|
|
52
|
+
}
|
|
53
|
+
/** Complete workflow definition (maps to YAML structure). */
|
|
54
|
+
export interface WorkflowDefinition {
|
|
55
|
+
/** Workflow identifier */
|
|
56
|
+
name: string;
|
|
57
|
+
/** Human-readable description */
|
|
58
|
+
description: string;
|
|
59
|
+
/** Semantic version */
|
|
60
|
+
version: string;
|
|
61
|
+
/** Author / contributor */
|
|
62
|
+
author?: string;
|
|
63
|
+
/** When to select this workflow */
|
|
64
|
+
triggers: WorkflowTrigger;
|
|
65
|
+
/** Configurable parameters */
|
|
66
|
+
parameters?: Record<string, WorkflowParameter>;
|
|
67
|
+
/** Ordered list of analysis steps */
|
|
68
|
+
steps: WorkflowStep[];
|
|
69
|
+
/** Output format specification */
|
|
70
|
+
output?: {
|
|
71
|
+
format: "json" | "text";
|
|
72
|
+
sections?: OutputSection[];
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Result of executing a single workflow step. */
|
|
76
|
+
export interface StepResult {
|
|
77
|
+
/** Step name */
|
|
78
|
+
name: string;
|
|
79
|
+
/** Tool that was run */
|
|
80
|
+
tool: string;
|
|
81
|
+
/** Whether the step succeeded */
|
|
82
|
+
success: boolean;
|
|
83
|
+
/** Raw output from the tool */
|
|
84
|
+
output?: string;
|
|
85
|
+
/** Exit code from the tool */
|
|
86
|
+
exitCode?: number;
|
|
87
|
+
/** Error message if failed */
|
|
88
|
+
error?: string;
|
|
89
|
+
/** Full command string that was executed */
|
|
90
|
+
command?: string;
|
|
91
|
+
/** Whether the step was skipped (condition not met) */
|
|
92
|
+
skipped?: boolean;
|
|
93
|
+
/** Number of retries that were attempted */
|
|
94
|
+
retries?: number;
|
|
95
|
+
/** Elapsed time in ms */
|
|
96
|
+
elapsed_ms: number;
|
|
97
|
+
}
|
|
98
|
+
/** Result of executing a complete workflow. */
|
|
99
|
+
export interface WorkflowResult {
|
|
100
|
+
/** Workflow name */
|
|
101
|
+
workflow: string;
|
|
102
|
+
/** Overall success (all non-skipped steps succeeded or continued) */
|
|
103
|
+
success: boolean;
|
|
104
|
+
/** Results for each step */
|
|
105
|
+
steps: StepResult[];
|
|
106
|
+
/** Total elapsed time in ms */
|
|
107
|
+
elapsed_ms: number;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workflows/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflows/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@remnux/mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for executing REMnux malware analysis tools",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"remnux-mcp-server": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc && cp -r src/config dist/ && chmod +x dist/cli.js",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"start": "node dist/cli.js",
|
|
14
|
+
"lint": "eslint src/",
|
|
15
|
+
"test": "vitest",
|
|
16
|
+
"prepare": "husky",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"mcp",
|
|
21
|
+
"model-context-protocol",
|
|
22
|
+
"remnux",
|
|
23
|
+
"malware-analysis",
|
|
24
|
+
"reverse-engineering",
|
|
25
|
+
"security"
|
|
26
|
+
],
|
|
27
|
+
"author": "Zeltser Security Corp",
|
|
28
|
+
"license": "GPL-3.0-only",
|
|
29
|
+
"files": [
|
|
30
|
+
"dist/",
|
|
31
|
+
"!dist/__tests__/",
|
|
32
|
+
"!dist/**/__tests__/",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/REMnux/remnux-mcp-server.git"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://remnux.org",
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
46
|
+
"dockerode": "^4.0.0",
|
|
47
|
+
"ioc-extractor": "^8.1.3",
|
|
48
|
+
"ssh2": "^1.15.0",
|
|
49
|
+
"zod": "^3.23.0"
|
|
50
|
+
},
|
|
51
|
+
"lint-staged": {
|
|
52
|
+
"src/**/*.ts": [
|
|
53
|
+
"eslint --fix --no-warn-ignored",
|
|
54
|
+
"bash -c 'tsc --noEmit'"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/dockerode": "^3.3.0",
|
|
59
|
+
"@types/node": "^20.0.0",
|
|
60
|
+
"@types/ssh2": "^1.15.0",
|
|
61
|
+
"eslint": "^9.0.0",
|
|
62
|
+
"husky": "^9.1.7",
|
|
63
|
+
"lint-staged": "^16.2.7",
|
|
64
|
+
"typescript": "^5.4.0",
|
|
65
|
+
"typescript-eslint": "^8.54.0",
|
|
66
|
+
"vitest": "^1.6.0"
|
|
67
|
+
}
|
|
68
|
+
}
|