agent-mcp-guard 0.4.6 → 0.4.7

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/README.md CHANGED
@@ -19,7 +19,7 @@ Live demo PR: [mcp-guard-demo#1](https://github.com/ChaoYue0307/mcp-guard-demo/p
19
19
  <a href="https://github.com/marketplace/actions/mcp-guard-mcp-security-scanner"><img alt="GitHub Marketplace" src="https://img.shields.io/badge/Marketplace-mcp--guard-0f766e?logo=github"></a>
20
20
  <a href="https://github.com/ChaoYue0307/mcp-guard/actions"><img alt="CI" src="https://github.com/ChaoYue0307/mcp-guard/actions/workflows/ci.yml/badge.svg"></a>
21
21
  <a href="LICENSE"><img alt="License" src="https://img.shields.io/badge/license-Apache--2.0-111827"></a>
22
- <a href="https://github.com/ChaoYue0307/mcp-guard/releases/tag/v0.4.6"><img alt="Release" src="https://img.shields.io/github/v/release/ChaoYue0307/mcp-guard?color=7c2d12"></a>
22
+ <a href="https://github.com/ChaoYue0307/mcp-guard/releases/tag/v0.4.7"><img alt="Release" src="https://img.shields.io/github/v/release/ChaoYue0307/mcp-guard?color=7c2d12"></a>
23
23
  </p>
24
24
 
25
25
  ## Install
@@ -93,7 +93,7 @@ mcp-guard scan --config .mcp.json --baseline .mcp-guard-baseline.json --fail-on
93
93
  Use the GitHub Action:
94
94
 
95
95
  ```yaml
96
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
96
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
97
97
  with:
98
98
  config: .mcp.json
99
99
  # policy: .mcp-guard-policy.json
@@ -152,7 +152,7 @@ For paid setup or internal review handoff, `mcp-guard audit` writes a complete e
152
152
  - remediation plan grouped by MCP server;
153
153
  - remediation checklist for PR or handoff tracking;
154
154
  - Markdown, HTML, JSON, and SARIF reports;
155
- - machine-readable audit manifest.
155
+ - machine-readable audit manifest with artifact hashes.
156
156
 
157
157
  For stricter governance, commit `.mcp-guard-policy.json` and define the commands, remote packages, filesystem roots, and remote MCP endpoints the team has approved. See [Policy files](docs/policy.md).
158
158
 
package/docs/audit.md CHANGED
@@ -37,7 +37,7 @@ mcp-guard audit --config .mcp.json --fail-on high
37
37
  | `mcp-guard-report.html` | Readable HTML report for review artifacts. |
38
38
  | `mcp-guard-report.json` | Redacted machine-readable report for automation. |
39
39
  | `mcp-guard.sarif` | SARIF 2.1.0 report for GitHub code scanning. |
40
- | `mcp-guard-audit-manifest.json` | Manifest listing status, summary, policy/baseline context, and file paths. |
40
+ | `mcp-guard-audit-manifest.json` | Manifest listing status, summary, policy/baseline context, file paths, SHA-256 hashes, and artifact sizes. |
41
41
 
42
42
  ## Review Flow
43
43
 
@@ -46,7 +46,8 @@ mcp-guard audit --config .mcp.json --fail-on high
46
46
  3. Work through `mcp-guard-remediation.md` with the engineering team.
47
47
  4. Track concrete work in `mcp-guard-remediation-checklist.md`.
48
48
  5. Use `mcp-guard-report.html` for readable evidence and `mcp-guard-report.json` or `mcp-guard.sarif` for automation.
49
- 6. Commit a reviewed policy and baseline only after the team has decided what risk is intentionally accepted.
49
+ 6. Use the `integrity.artifacts` section in `mcp-guard-audit-manifest.json` when you need to prove an audit artifact has not changed.
50
+ 7. Commit a reviewed policy and baseline only after the team has decided what risk is intentionally accepted.
50
51
 
51
52
  ## Privacy
52
53
 
package/docs/baseline.md CHANGED
@@ -30,7 +30,7 @@ If the scan finds only baseline-accepted findings, the exit code is `0`. If a ne
30
30
  ## GitHub Action
31
31
 
32
32
  ```yaml
33
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
33
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
34
34
  with:
35
35
  config: .mcp.json
36
36
  baseline: .mcp-guard-baseline.json
@@ -45,7 +45,7 @@ The generated Markdown, HTML, JSON, and PR comment separate active findings from
45
45
  {
46
46
  "version": 1,
47
47
  "generatedAt": "2026-05-10T00:00:00.000Z",
48
- "toolVersion": "0.4.6",
48
+ "toolVersion": "0.4.7",
49
49
  "findings": [
50
50
  {
51
51
  "fingerprint": "mcpg_a009b2c2",
@@ -17,7 +17,7 @@ Deliverables:
17
17
  - install the CLI and GitHub Action;
18
18
  - run `mcp-guard init` or generate an equivalent workflow manually;
19
19
  - generate Markdown, HTML, JSON, and SARIF reports;
20
- - generate a customer handoff audit pack with executive summary, remediation plan, remediation checklist, reports, and manifest;
20
+ - generate a customer handoff audit pack with executive summary, remediation plan, remediation checklist, reports, and hashed manifest;
21
21
  - define an initial `.mcp-guard-policy.json` for approved commands, packages, directories, and remote URLs;
22
22
  - create an initial baseline for accepted known findings;
23
23
  - enable PR comments and optional SARIF upload;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Use the `mcp-guard` action to scan MCP and AI agent tool configuration in pull requests and CI.
4
4
 
5
- The action runs the CLI from the pinned GitHub Action tag, generates an audit pack with Markdown, HTML, JSON, SARIF, remediation, checklist, and manifest files, writes a job summary, uploads reports as an artifact, and fails the job when findings meet your selected severity threshold.
5
+ The action runs the CLI from the pinned GitHub Action tag, generates an audit pack with Markdown, HTML, JSON, SARIF, remediation, checklist, and hashed manifest files, writes a job summary, uploads reports as an artifact, and fails the job when findings meet your selected severity threshold.
6
6
 
7
7
  It can also use a committed baseline to accept known findings, enforce a committed policy file, and optionally post a pull request comment with only the active findings.
8
8
 
@@ -37,7 +37,7 @@ jobs:
37
37
  runs-on: ubuntu-latest
38
38
  steps:
39
39
  - uses: actions/checkout@v6
40
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
40
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
41
41
  with:
42
42
  config: .mcp.json
43
43
  fail-on: high
@@ -65,7 +65,7 @@ jobs:
65
65
  runs-on: ubuntu-latest
66
66
  steps:
67
67
  - uses: actions/checkout@v6
68
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
68
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
69
69
  with:
70
70
  config: .mcp.json
71
71
  fail-on: high
@@ -77,7 +77,7 @@ jobs:
77
77
  Use `fail-on: none` when you want artifacts and summaries without blocking a pull request.
78
78
 
79
79
  ```yaml
80
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
80
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
81
81
  with:
82
82
  fail-on: none
83
83
  ```
@@ -93,7 +93,7 @@ mcp-guard scan --config .mcp.json --write-baseline .mcp-guard-baseline.json
93
93
  Commit `.mcp-guard-baseline.json`, then reference it from the action:
94
94
 
95
95
  ```yaml
96
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
96
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
97
97
  with:
98
98
  config: .mcp.json
99
99
  baseline: .mcp-guard-baseline.json
@@ -107,7 +107,7 @@ Reports will show active findings separately from findings accepted by the basel
107
107
  Use a policy when you want CI to enforce approved commands, packages, directories, and remote URLs.
108
108
 
109
109
  ```yaml
110
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
110
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
111
111
  with:
112
112
  config: .mcp.json
113
113
  policy: .mcp-guard-policy.json
@@ -37,7 +37,7 @@ mcp-guard audit --config .mcp.json --policy .mcp-guard-policy.json --output-dir
37
37
  ## GitHub Action Setup
38
38
 
39
39
  ```yaml
40
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
40
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
41
41
  with:
42
42
  config: .mcp.json
43
43
  baseline: .mcp-guard-baseline.json
@@ -23,7 +23,7 @@ jobs:
23
23
  runs-on: ubuntu-latest
24
24
  steps:
25
25
  - uses: actions/checkout@v6
26
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
26
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
27
27
  with:
28
28
  config: .mcp.json
29
29
  fail-on: high
@@ -42,7 +42,7 @@ jobs:
42
42
  runs-on: ubuntu-latest
43
43
  steps:
44
44
  - uses: actions/checkout@v6
45
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
45
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
46
46
  with:
47
47
  config: .mcp.json
48
48
  fail-on: high
@@ -88,7 +88,7 @@ The action generates an audit pack:
88
88
  - SARIF 2.1.0 for GitHub code scanning.
89
89
  - Remediation Markdown for server-by-server handoff.
90
90
  - Remediation checklist for PR and setup tracking.
91
- - Audit manifest JSON for downstream automation.
91
+ - Audit manifest JSON with SHA-256 hashes and byte sizes for downstream automation.
92
92
 
93
93
  Secret-like values are redacted before reports are written.
94
94
 
@@ -103,7 +103,7 @@ mcp-guard scan --config .mcp.json --write-baseline .mcp-guard-baseline.json
103
103
  Then enforce only new findings:
104
104
 
105
105
  ```yaml
106
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
106
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
107
107
  with:
108
108
  config: .mcp.json
109
109
  baseline: .mcp-guard-baseline.json
@@ -115,7 +115,7 @@ Then enforce only new findings:
115
115
  Commit `.mcp-guard-policy.json` or pass `policy` to enforce approved commands, remote packages, directories, and remote MCP URLs.
116
116
 
117
117
  ```yaml
118
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
118
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
119
119
  with:
120
120
  config: .mcp.json
121
121
  policy: .mcp-guard-policy.json
@@ -82,17 +82,17 @@ Code quality
82
82
  Current release title:
83
83
 
84
84
  ```text
85
- v0.4.6
85
+ v0.4.7
86
86
  ```
87
87
 
88
88
  Release notes:
89
89
 
90
90
  ```text
91
- Remediation checklist release.
91
+ Audit integrity release.
92
92
 
93
- - Adds a checkbox remediation checklist to every `mcp-guard audit` pack.
94
- - PR comments and job summaries now include first remediation steps, not only finding counts.
95
- - Keeps executive summary, remediation plan, Markdown, HTML, JSON, SARIF, manifest, policy, baseline, artifacts, and SARIF upload support.
93
+ - Adds SHA-256 checksums and byte sizes for generated audit artifacts in `mcp-guard-audit-manifest.json`.
94
+ - Keeps remediation checklist, first remediation steps in PR comments, executive summary, remediation plan, Markdown, HTML, JSON, SARIF, policy, baseline, artifacts, and SARIF upload support.
95
+ - Improves paid setup and internal review handoff by making generated evidence easier to verify after delivery.
96
96
  ```
97
97
 
98
98
  ## Manual Publishing Steps
@@ -105,7 +105,7 @@ Completed:
105
105
  - README, docs, and website examples now use:
106
106
 
107
107
  ```yaml
108
- - uses: ChaoYue0307/mcp-guard-action@v0.4.6
108
+ - uses: ChaoYue0307/mcp-guard-action@v0.4.7
109
109
  ```
110
110
 
111
111
  Remaining Marketplace web step:
@@ -13,7 +13,7 @@ It is not currently advertised as an active consulting service. Keep public webs
13
13
  ## Deliverables
14
14
 
15
15
  - MCP and agent tool inventory.
16
- - `mcp-guard audit` evidence pack with executive summary, remediation plan, remediation checklist, reports, and manifest.
16
+ - `mcp-guard audit` evidence pack with executive summary, remediation plan, remediation checklist, reports, and hashed manifest.
17
17
  - Risk report covering shell access, package execution, filesystem scope, secrets, remote servers, and dangerous commands.
18
18
  - Practical remediation checklist.
19
19
  - Optional PR with safer config and policy changes.
package/docs/roadmap.md CHANGED
@@ -13,7 +13,7 @@
13
13
  - Optional GitHub pull request comments from the Marketplace Action.
14
14
  - `mcp-guard init` for bootstrapping a GitHub Action workflow and optional baseline.
15
15
  - Policy file enforcement for approved commands, packages, directories, and remote URLs.
16
- - `mcp-guard audit` for review-ready executive summaries, remediation plans, remediation checklists, reports, and manifests.
16
+ - `mcp-guard audit` for review-ready executive summaries, remediation plans, remediation checklists, reports, and hashed manifests.
17
17
  - npm Trusted Publishing workflow prepared for tokenless release publishing.
18
18
 
19
19
  ## Next
@@ -36,7 +36,7 @@ Configure this once on npmjs.com:
36
36
  After this is saved, run the workflow from GitHub Actions with the release tag, for example:
37
37
 
38
38
  ```text
39
- v0.4.6
39
+ v0.4.7
40
40
  ```
41
41
 
42
42
  ## Release Flow After Setup
@@ -44,7 +44,7 @@ v0.4.6
44
44
  1. Update `package.json` and `src/cli.js`.
45
45
  2. Run `npm test` and `npm run release:check`.
46
46
  3. Commit and push to `main`.
47
- 4. Create a GitHub release tag such as `v0.4.6`.
47
+ 4. Create a GitHub release tag such as `v0.4.7`.
48
48
  5. Run the `Publish npm` workflow with the same tag.
49
49
  6. Verify npm:
50
50
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-mcp-guard",
3
- "version": "0.4.6",
3
+ "version": "0.4.7",
4
4
  "description": "Open-source CLI scanner for risky MCP server and AI agent tool configuration.",
5
5
  "type": "module",
6
6
  "homepage": "https://chaoyue0307.github.io/mcp-guard/",
@@ -2,9 +2,9 @@
2
2
  "version": 1,
3
3
  "tool": {
4
4
  "name": "mcp-guard",
5
- "version": "0.4.6"
5
+ "version": "0.4.7"
6
6
  },
7
- "generatedAt": "2026-05-10T19:56:07.107Z",
7
+ "generatedAt": "2026-05-10T20:08:00.622Z",
8
8
  "status": "needs_review",
9
9
  "failOn": "none",
10
10
  "outputDir": "site/e2e/audit",
@@ -36,5 +36,52 @@
36
36
  "jsonReport": "site/e2e/audit/mcp-guard-report.json",
37
37
  "sarifReport": "site/e2e/audit/mcp-guard.sarif",
38
38
  "manifest": "site/e2e/audit/mcp-guard-audit-manifest.json"
39
+ },
40
+ "integrity": {
41
+ "algorithm": "sha256",
42
+ "artifacts": [
43
+ {
44
+ "key": "executiveSummary",
45
+ "path": "site/e2e/audit/mcp-guard-executive-summary.md",
46
+ "bytes": 1764,
47
+ "sha256": "d4679b3353a25ed4f88479ae2594fa6a7e2b1b61a9455b56a61e10a70131c87e"
48
+ },
49
+ {
50
+ "key": "remediation",
51
+ "path": "site/e2e/audit/mcp-guard-remediation.md",
52
+ "bytes": 2752,
53
+ "sha256": "1a7a83531f9fea7f0dc8a074a378151f1f7e10a713abc93136e0200bb1dbd35a"
54
+ },
55
+ {
56
+ "key": "remediationChecklist",
57
+ "path": "site/e2e/audit/mcp-guard-remediation-checklist.md",
58
+ "bytes": 2056,
59
+ "sha256": "d75a40e9c2f243cf9193e50d6d9fa8c56e2d50950deb2f1cc843e230c002e548"
60
+ },
61
+ {
62
+ "key": "markdownReport",
63
+ "path": "site/e2e/audit/mcp-guard-report.md",
64
+ "bytes": 3297,
65
+ "sha256": "11a09f58c19ebb836ff4da6f75d050b508fc989dd41ea1c31a02dbafc3367317"
66
+ },
67
+ {
68
+ "key": "htmlReport",
69
+ "path": "site/e2e/audit/mcp-guard-report.html",
70
+ "bytes": 12988,
71
+ "sha256": "3f597e3e1423159f2665b5f5c3b754c2eda4df5645cc2707fa872ddb3c9b7a3c"
72
+ },
73
+ {
74
+ "key": "jsonReport",
75
+ "path": "site/e2e/audit/mcp-guard-report.json",
76
+ "bytes": 5938,
77
+ "sha256": "a7b2f086928c1d697c4402b37e84b055a7e12ed2bef55654a19733a80d082947"
78
+ },
79
+ {
80
+ "key": "sarifReport",
81
+ "path": "site/e2e/audit/mcp-guard.sarif",
82
+ "bytes": 20856,
83
+ "sha256": "994c3bd89e616a76c53cd3797f6323001cc11dcb1afd96ddaeeb9d53c6432ee8"
84
+ }
85
+ ]
39
86
  }
40
87
  }
@@ -1,6 +1,6 @@
1
1
  # mcp-guard Executive Summary
2
2
 
3
- Generated: 2026-05-10T19:56:07.107Z
3
+ Generated: 2026-05-10T20:08:00.622Z
4
4
  Status: **Needs review**
5
5
  Risk score: **98**
6
6
  Fail threshold: **none**
@@ -1,6 +1,6 @@
1
1
  # mcp-guard Remediation Checklist
2
2
 
3
- Generated: 2026-05-10T19:56:07.107Z
3
+ Generated: 2026-05-10T20:08:00.622Z
4
4
  Risk score: **98**
5
5
  Active findings: **9**
6
6
 
@@ -1,6 +1,6 @@
1
1
  # mcp-guard Remediation Plan
2
2
 
3
- Generated: 2026-05-10T19:56:07.107Z
3
+ Generated: 2026-05-10T20:08:00.622Z
4
4
 
5
5
  ## Priority
6
6
 
@@ -297,7 +297,7 @@
297
297
  <div class="metric"><strong>1</strong><span>Scanned files</span></div>
298
298
  <div class="metric"><strong>3</strong><span>MCP servers</span></div>
299
299
  <div class="metric"><strong>9</strong><span>Active findings</span></div>
300
- <div class="metric"><strong>2026-05-10 19:56 UTC</strong><span>Generated</span></div>
300
+ <div class="metric"><strong>2026-05-10 20:08 UTC</strong><span>Generated</span></div>
301
301
  </div>
302
302
  </div>
303
303
  <aside class="scorecard" aria-label="Risk score">
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "metadata": {
3
- "generatedAt": "2026-05-10T19:56:07.107Z",
3
+ "generatedAt": "2026-05-10T20:08:00.622Z",
4
4
  "cwd": ".",
5
5
  "home": "~",
6
6
  "policyPath": "",
7
7
  "policyEnabled": false,
8
- "toolVersion": "0.4.6"
8
+ "toolVersion": "0.4.7"
9
9
  },
10
10
  "policy": null,
11
11
  "scannedFiles": [
@@ -1,6 +1,6 @@
1
1
  # mcp-guard Scan Report
2
2
 
3
- Generated: 2026-05-10T19:56:07.107Z
3
+ Generated: 2026-05-10T20:08:00.622Z
4
4
 
5
5
  ## Summary
6
6
 
@@ -7,7 +7,7 @@
7
7
  "driver": {
8
8
  "name": "mcp-guard",
9
9
  "informationUri": "https://github.com/ChaoYue0307/mcp-guard",
10
- "semanticVersion": "0.4.6",
10
+ "semanticVersion": "0.4.7",
11
11
  "rules": [
12
12
  {
13
13
  "id": "MCP010",
@@ -297,7 +297,7 @@
297
297
  <div class="metric"><strong>1</strong><span>Scanned files</span></div>
298
298
  <div class="metric"><strong>3</strong><span>MCP servers</span></div>
299
299
  <div class="metric"><strong>9</strong><span>Active findings</span></div>
300
- <div class="metric"><strong>2026-05-10 19:56 UTC</strong><span>Generated</span></div>
300
+ <div class="metric"><strong>2026-05-10 20:07 UTC</strong><span>Generated</span></div>
301
301
  </div>
302
302
  </div>
303
303
  <aside class="scorecard" aria-label="Risk score">
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "metadata": {
3
- "generatedAt": "2026-05-10T19:56:04.165Z",
3
+ "generatedAt": "2026-05-10T20:07:57.237Z",
4
4
  "cwd": ".",
5
5
  "home": "~",
6
6
  "policyPath": "",
7
7
  "policyEnabled": false,
8
- "toolVersion": "0.4.6"
8
+ "toolVersion": "0.4.7"
9
9
  },
10
10
  "policy": null,
11
11
  "scannedFiles": [
@@ -1,6 +1,6 @@
1
1
  # mcp-guard Scan Report
2
2
 
3
- Generated: 2026-05-10T19:55:57.838Z
3
+ Generated: 2026-05-10T20:07:52.252Z
4
4
 
5
5
  ## Summary
6
6
 
@@ -7,7 +7,7 @@
7
7
  "driver": {
8
8
  "name": "mcp-guard",
9
9
  "informationUri": "https://github.com/ChaoYue0307/mcp-guard",
10
- "semanticVersion": "0.4.6",
10
+ "semanticVersion": "0.4.7",
11
11
  "rules": [
12
12
  {
13
13
  "id": "MCP010",
package/src/audit.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import fs from "node:fs/promises";
2
+ import crypto from "node:crypto";
2
3
  import path from "node:path";
3
4
  import { applyBaseline, loadBaselineFile } from "./baseline.js";
4
5
  import { displayPath } from "./fingerprint.js";
@@ -44,12 +45,6 @@ export async function writeAuditPack({
44
45
 
45
46
  await fs.mkdir(resolvedOutputDir, { recursive: true });
46
47
 
47
- const manifest = buildAuditManifest(result, files, {
48
- cwd,
49
- outputDir: resolvedOutputDir,
50
- failOn
51
- });
52
-
53
48
  await Promise.all([
54
49
  fs.writeFile(files.executiveSummary, generateExecutiveSummary(result, { failOn }), "utf8"),
55
50
  fs.writeFile(files.remediation, generateRemediationPlan(result), "utf8"),
@@ -59,6 +54,14 @@ export async function writeAuditPack({
59
54
  fs.writeFile(files.jsonReport, `${generateJsonReport(result)}\n`, "utf8"),
60
55
  fs.writeFile(files.sarifReport, `${generateSarifReport(result)}\n`, "utf8")
61
56
  ]);
57
+
58
+ const artifacts = await auditArtifacts(files, cwd);
59
+ const manifest = buildAuditManifest(result, files, {
60
+ cwd,
61
+ outputDir: resolvedOutputDir,
62
+ failOn,
63
+ artifacts
64
+ });
62
65
  await fs.writeFile(files.manifest, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
63
66
 
64
67
  return {
@@ -246,7 +249,7 @@ function generateRemediationChecklist(result) {
246
249
  return `${lines.join("\n")}\n`;
247
250
  }
248
251
 
249
- function buildAuditManifest(result, files, { cwd, outputDir, failOn }) {
252
+ function buildAuditManifest(result, files, { cwd, outputDir, failOn, artifacts }) {
250
253
  return {
251
254
  version: 1,
252
255
  tool: {
@@ -268,10 +271,29 @@ function buildAuditManifest(result, files, { cwd, outputDir, failOn }) {
268
271
  baseline: result.baseline || { enabled: false },
269
272
  files: Object.fromEntries(
270
273
  Object.entries(files).map(([key, filePath]) => [key, displayPath(filePath, cwd)])
271
- )
274
+ ),
275
+ integrity: {
276
+ algorithm: "sha256",
277
+ artifacts
278
+ }
272
279
  };
273
280
  }
274
281
 
282
+ async function auditArtifacts(files, cwd) {
283
+ const artifacts = [];
284
+ for (const [key, filePath] of Object.entries(files)) {
285
+ if (key === "manifest") continue;
286
+ const content = await fs.readFile(filePath);
287
+ artifacts.push({
288
+ key,
289
+ path: displayPath(filePath, cwd),
290
+ bytes: content.byteLength,
291
+ sha256: crypto.createHash("sha256").update(content).digest("hex")
292
+ });
293
+ }
294
+ return artifacts;
295
+ }
296
+
275
297
  function decisionGuidance(result) {
276
298
  if (result.findings.length === 0) {
277
299
  return ["No active findings were detected. Continue reviewing new MCP servers before adding them."];
package/src/cli.js CHANGED
@@ -7,7 +7,7 @@ import { scan } from "./scan.js";
7
7
  import { generateHtmlReport, generateJsonReport, generateMarkdownReport, generateSarifReport, generateTextReport } from "./report.js";
8
8
  import { compareSeverity, severityRank } from "./severity.js";
9
9
 
10
- const VERSION = "0.4.6";
10
+ const VERSION = "0.4.7";
11
11
 
12
12
  export async function runCli(argv, io) {
13
13
  const args = argv.slice(2);