windows-exe-decompiler-mcp-server 0.1.0 → 0.1.1

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.
Files changed (31) hide show
  1. package/README.md +5 -0
  2. package/dist/analysis-task-runner.js +66 -0
  3. package/dist/index.js +6 -4
  4. package/dist/server.js +1 -1
  5. package/dist/tools/artifact-read.d.ts +2 -2
  6. package/dist/tools/artifacts-list.d.ts +8 -8
  7. package/dist/tools/binary-role-profile.d.ts +817 -0
  8. package/dist/tools/binary-role-profile.js +426 -0
  9. package/dist/tools/code-function-explain-review.d.ts +42 -42
  10. package/dist/tools/code-function-rename-review.d.ts +48 -48
  11. package/dist/tools/code-functions-reconstruct.d.ts +44 -44
  12. package/dist/tools/code-reconstruct-export.d.ts +6 -6
  13. package/dist/tools/code-reconstruct-plan.d.ts +6 -6
  14. package/dist/tools/dotnet-metadata-extract.d.ts +107 -107
  15. package/dist/tools/dotnet-reconstruct-export.d.ts +28 -28
  16. package/dist/tools/dotnet-types-list.d.ts +52 -52
  17. package/dist/tools/packer-detect.d.ts +4 -4
  18. package/dist/tools/report-generate.d.ts +9 -1
  19. package/dist/tools/report-generate.js +38 -4
  20. package/dist/tools/report-summarize.d.ts +498 -0
  21. package/dist/tools/report-summarize.js +84 -10
  22. package/dist/tools/sandbox-execute.d.ts +2 -2
  23. package/dist/tools/tool-help.d.ts +16 -16
  24. package/dist/tools/tool-help.js +12 -0
  25. package/dist/workflows/function-explanation-review.d.ts +94 -63
  26. package/dist/workflows/function-explanation-review.js +92 -42
  27. package/dist/workflows/reconstruct.d.ts +55 -19
  28. package/dist/workflows/reconstruct.js +58 -20
  29. package/dist/workflows/semantic-name-review.d.ts +98 -67
  30. package/dist/workflows/semantic-name-review.js +108 -58
  31. package/package.json +1 -1
package/README.md CHANGED
@@ -37,6 +37,7 @@ Primary use cases:
37
37
  - `yara.scan`
38
38
  - `runtime.detect`
39
39
  - `packer.detect`
40
+ - `binary.role.profile`
40
41
 
41
42
  ### Ghidra and code analysis
42
43
 
@@ -90,6 +91,7 @@ tests/ unit and integration tests
90
91
  workers/ Python worker, YARA rules, dynamic helpers
91
92
  install-to-codex.ps1 local Codex MCP install helper
92
93
  install-to-copilot.ps1 local GitHub Copilot MCP install helper
94
+ docs/QUALITY_EVALUATION.md evaluation checklist for regression and release readiness
93
95
  ```
94
96
 
95
97
  ## Prerequisites
@@ -267,6 +269,9 @@ That tag push will trigger the publish workflow.
267
269
  See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for local
268
270
  setup, validation, and release steps.
269
271
 
272
+ For release-quality regression planning, see [`docs/QUALITY_EVALUATION.md`](./docs/QUALITY_EVALUATION.md)
273
+ and [`examples/benchmark-corpus.example.json`](./examples/benchmark-corpus.example.json).
274
+
270
275
  ## Security
271
276
 
272
277
  See [`SECURITY.md`](./SECURITY.md) for disclosure guidance
@@ -5,6 +5,9 @@
5
5
  import { DecompilerWorker, GhidraProcessError } from './decompiler-worker.js';
6
6
  import { logger } from './logger.js';
7
7
  import { deepStaticWorkflow } from './workflows/deep-static.js';
8
+ import { createReconstructWorkflowHandler } from './workflows/reconstruct.js';
9
+ import { createSemanticNameReviewWorkflowHandler } from './workflows/semantic-name-review.js';
10
+ import { createFunctionExplanationReviewWorkflowHandler } from './workflows/function-explanation-review.js';
8
11
  export class AnalysisTaskRunner {
9
12
  jobQueue;
10
13
  decompilerWorker;
@@ -154,6 +157,69 @@ export class AnalysisTaskRunner {
154
157
  },
155
158
  };
156
159
  }
160
+ if (job.tool === 'workflow.reconstruct') {
161
+ if (!this.cacheManager) {
162
+ throw new Error('workflow.reconstruct requires cache manager for queued execution');
163
+ }
164
+ this.jobQueue.updateProgress(job.id, 5);
165
+ const handler = createReconstructWorkflowHandler(this.workspaceManager, this.database, this.cacheManager);
166
+ const result = await handler(job.args || {});
167
+ this.jobQueue.updateProgress(job.id, 100);
168
+ return {
169
+ jobId: job.id,
170
+ ok: result.ok,
171
+ data: result.data,
172
+ errors: result.errors || [],
173
+ warnings: result.warnings || [],
174
+ artifacts: result.artifacts || [],
175
+ metrics: {
176
+ elapsedMs: typeof result.metrics?.elapsed_ms === 'number' ? result.metrics.elapsed_ms : 0,
177
+ peakRssMb: 0,
178
+ },
179
+ };
180
+ }
181
+ if (job.tool === 'workflow.semantic_name_review') {
182
+ if (!this.cacheManager) {
183
+ throw new Error('workflow.semantic_name_review requires cache manager for queued execution');
184
+ }
185
+ this.jobQueue.updateProgress(job.id, 5);
186
+ const handler = createSemanticNameReviewWorkflowHandler(this.workspaceManager, this.database, this.cacheManager);
187
+ const result = await handler(job.args || {});
188
+ this.jobQueue.updateProgress(job.id, 100);
189
+ return {
190
+ jobId: job.id,
191
+ ok: result.ok,
192
+ data: result.data,
193
+ errors: result.errors || [],
194
+ warnings: result.warnings || [],
195
+ artifacts: result.artifacts || [],
196
+ metrics: {
197
+ elapsedMs: typeof result.metrics?.elapsed_ms === 'number' ? result.metrics.elapsed_ms : 0,
198
+ peakRssMb: 0,
199
+ },
200
+ };
201
+ }
202
+ if (job.tool === 'workflow.function_explanation_review') {
203
+ if (!this.cacheManager) {
204
+ throw new Error('workflow.function_explanation_review requires cache manager for queued execution');
205
+ }
206
+ this.jobQueue.updateProgress(job.id, 5);
207
+ const handler = createFunctionExplanationReviewWorkflowHandler(this.workspaceManager, this.database, this.cacheManager);
208
+ const result = await handler(job.args || {});
209
+ this.jobQueue.updateProgress(job.id, 100);
210
+ return {
211
+ jobId: job.id,
212
+ ok: result.ok,
213
+ data: result.data,
214
+ errors: result.errors || [],
215
+ warnings: result.warnings || [],
216
+ artifacts: result.artifacts || [],
217
+ metrics: {
218
+ elapsedMs: typeof result.metrics?.elapsed_ms === 'number' ? result.metrics.elapsed_ms : 0,
219
+ peakRssMb: 0,
220
+ },
221
+ };
222
+ }
157
223
  throw new Error(`Unsupported queued tool: ${job.tool}`);
158
224
  }
159
225
  }
package/dist/index.js CHANGED
@@ -25,6 +25,7 @@ import { runtimeDetectToolDefinition, createRuntimeDetectHandler } from './tools
25
25
  import { dotNetMetadataExtractToolDefinition, createDotNetMetadataExtractHandler } from './tools/dotnet-metadata-extract.js';
26
26
  import { dotNetTypesListToolDefinition, createDotNetTypesListHandler } from './tools/dotnet-types-list.js';
27
27
  import { packerDetectToolDefinition, createPackerDetectHandler } from './tools/packer-detect.js';
28
+ import { binaryRoleProfileToolDefinition, createBinaryRoleProfileHandler, } from './tools/binary-role-profile.js';
28
29
  import { triageWorkflowToolDefinition, createTriageWorkflowHandler } from './workflows/triage.js';
29
30
  import { reconstructWorkflowToolDefinition, createReconstructWorkflowHandler } from './workflows/reconstruct.js';
30
31
  import { deepStaticWorkflowToolDefinition, createDeepStaticWorkflowHandler } from './workflows/deep-static.js';
@@ -113,18 +114,19 @@ async function main() {
113
114
  server.registerTool(dotNetTypesListToolDefinition, createDotNetTypesListHandler(workspaceManager, database, cacheManager));
114
115
  // Task 8.10: packer.detect tool
115
116
  server.registerTool(packerDetectToolDefinition, createPackerDetectHandler(workspaceManager, database, cacheManager));
117
+ server.registerTool(binaryRoleProfileToolDefinition, createBinaryRoleProfileHandler(workspaceManager, database, cacheManager));
116
118
  // Task 9.1: workflow.triage - Quick triage workflow
117
119
  server.registerTool(triageWorkflowToolDefinition, createTriageWorkflowHandler(workspaceManager, database, cacheManager));
118
120
  // Task 40.5.1: workflow.reconstruct - End-to-end source reconstruction workflow
119
- server.registerTool(reconstructWorkflowToolDefinition, createReconstructWorkflowHandler(workspaceManager, database, cacheManager));
121
+ server.registerTool(reconstructWorkflowToolDefinition, createReconstructWorkflowHandler(workspaceManager, database, cacheManager, undefined, jobQueue));
120
122
  // Task 16.x: workflow.deep_static - Comprehensive long-running static analysis
121
123
  server.registerTool(deepStaticWorkflowToolDefinition, createDeepStaticWorkflowHandler(workspaceManager, database, cacheManager, jobQueue));
122
- server.registerTool(semanticNameReviewWorkflowToolDefinition, createSemanticNameReviewWorkflowHandler(workspaceManager, database, cacheManager, server));
123
- server.registerTool(functionExplanationReviewWorkflowToolDefinition, createFunctionExplanationReviewWorkflowHandler(workspaceManager, database, cacheManager, server));
124
+ server.registerTool(semanticNameReviewWorkflowToolDefinition, createSemanticNameReviewWorkflowHandler(workspaceManager, database, cacheManager, server, undefined, jobQueue));
125
+ server.registerTool(functionExplanationReviewWorkflowToolDefinition, createFunctionExplanationReviewWorkflowHandler(workspaceManager, database, cacheManager, server, undefined, jobQueue));
124
126
  // Task 9.2: report.summarize - Generate quick triage report
125
127
  server.registerTool(reportSummarizeToolDefinition, createReportSummarizeHandler(workspaceManager, database, cacheManager));
126
128
  // Task 24.x: report.generate - Generate stored multi-stage analysis report artifact
127
- server.registerTool(reportGenerateToolDefinition, createReportGenerateHandler(workspaceManager, database));
129
+ server.registerTool(reportGenerateToolDefinition, createReportGenerateHandler(workspaceManager, database, cacheManager));
128
130
  // Task 15.1: ghidra.analyze - Analyze binary with Ghidra
129
131
  server.registerTool(ghidraAnalyzeToolDefinition, createGhidraAnalyzeHandler(workspaceManager, database, jobQueue));
130
132
  // Task execution controls: query/cancel/sweep analysis jobs
package/dist/server.js CHANGED
@@ -30,7 +30,7 @@ export class MCPServer {
30
30
  // Initialize MCP SDK server
31
31
  this.server = new Server({
32
32
  name: 'windows-exe-decompiler-mcp-server',
33
- version: '0.1.0',
33
+ version: '0.1.1',
34
34
  }, {
35
35
  capabilities: {
36
36
  tools: {},
@@ -24,11 +24,11 @@ export declare const ArtifactReadInputSchema: z.ZodObject<{
24
24
  sample_id: string;
25
25
  recursive: boolean;
26
26
  encoding: "utf8" | "base64" | "auto";
27
+ max_bytes: number;
27
28
  include_untracked_files: boolean;
28
29
  scan_roots: string[];
29
30
  select_latest: boolean;
30
31
  include_content: boolean;
31
- max_bytes: number;
32
32
  parse_json: boolean;
33
33
  ioc_highlights: boolean;
34
34
  path?: string | undefined;
@@ -39,13 +39,13 @@ export declare const ArtifactReadInputSchema: z.ZodObject<{
39
39
  path?: string | undefined;
40
40
  recursive?: boolean | undefined;
41
41
  encoding?: "utf8" | "base64" | "auto" | undefined;
42
+ max_bytes?: number | undefined;
42
43
  artifact_id?: string | undefined;
43
44
  artifact_type?: string | undefined;
44
45
  include_untracked_files?: boolean | undefined;
45
46
  scan_roots?: string[] | undefined;
46
47
  select_latest?: boolean | undefined;
47
48
  include_content?: boolean | undefined;
48
- max_bytes?: number | undefined;
49
49
  parse_json?: boolean | undefined;
50
50
  ioc_highlights?: boolean | undefined;
51
51
  }>;
@@ -169,16 +169,16 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
169
169
  }, "strip", z.ZodTypeAny, {
170
170
  count: number;
171
171
  latest_created_at: string;
172
+ types: string[];
172
173
  untracked_count: number;
173
174
  tracked_count: number;
174
- types: string[];
175
175
  retention_buckets: string[];
176
176
  }, {
177
177
  count: number;
178
178
  latest_created_at: string;
179
+ types: string[];
179
180
  untracked_count: number;
180
181
  tracked_count: number;
181
- types: string[];
182
182
  retention_buckets: string[];
183
183
  }>>;
184
184
  by_retention_bucket: z.ZodRecord<z.ZodString, z.ZodNumber>;
@@ -205,9 +205,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
205
205
  session_index: Record<string, {
206
206
  count: number;
207
207
  latest_created_at: string;
208
+ types: string[];
208
209
  untracked_count: number;
209
210
  tracked_count: number;
210
- types: string[];
211
211
  retention_buckets: string[];
212
212
  }>;
213
213
  by_retention_bucket: Record<string, number>;
@@ -234,9 +234,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
234
234
  session_index: Record<string, {
235
235
  count: number;
236
236
  latest_created_at: string;
237
+ types: string[];
237
238
  untracked_count: number;
238
239
  tracked_count: number;
239
- types: string[];
240
240
  retention_buckets: string[];
241
241
  }>;
242
242
  by_retention_bucket: Record<string, number>;
@@ -266,9 +266,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
266
266
  session_index: Record<string, {
267
267
  count: number;
268
268
  latest_created_at: string;
269
+ types: string[];
269
270
  untracked_count: number;
270
271
  tracked_count: number;
271
- types: string[];
272
272
  retention_buckets: string[];
273
273
  }>;
274
274
  by_retention_bucket: Record<string, number>;
@@ -325,9 +325,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
325
325
  session_index: Record<string, {
326
326
  count: number;
327
327
  latest_created_at: string;
328
+ types: string[];
328
329
  untracked_count: number;
329
330
  tracked_count: number;
330
- types: string[];
331
331
  retention_buckets: string[];
332
332
  }>;
333
333
  by_retention_bucket: Record<string, number>;
@@ -403,9 +403,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
403
403
  session_index: Record<string, {
404
404
  count: number;
405
405
  latest_created_at: string;
406
+ types: string[];
406
407
  untracked_count: number;
407
408
  tracked_count: number;
408
- types: string[];
409
409
  retention_buckets: string[];
410
410
  }>;
411
411
  by_retention_bucket: Record<string, number>;
@@ -471,9 +471,9 @@ export declare const ArtifactsListOutputSchema: z.ZodObject<{
471
471
  session_index: Record<string, {
472
472
  count: number;
473
473
  latest_created_at: string;
474
+ types: string[];
474
475
  untracked_count: number;
475
476
  tracked_count: number;
476
- types: string[];
477
477
  retention_buckets: string[];
478
478
  }>;
479
479
  by_retention_bucket: Record<string, number>;