@kryptosai/mcp-observatory 0.28.0 → 1.28.2

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 (108) hide show
  1. package/COMMERCIAL.md +26 -5
  2. package/README.md +65 -12
  3. package/dist/src/action-receipt.d.ts +20 -0
  4. package/dist/src/action-receipt.js +85 -0
  5. package/dist/src/action-receipt.js.map +1 -0
  6. package/dist/src/audit.d.ts +64 -0
  7. package/dist/src/audit.js +359 -0
  8. package/dist/src/audit.js.map +1 -0
  9. package/dist/src/checks/attack-sim.d.ts +2 -0
  10. package/dist/src/checks/attack-sim.js +12 -0
  11. package/dist/src/checks/attack-sim.js.map +1 -1
  12. package/dist/src/cli.js +8 -1
  13. package/dist/src/cli.js.map +1 -1
  14. package/dist/src/commands/attack-sim.js +54 -2
  15. package/dist/src/commands/attack-sim.js.map +1 -1
  16. package/dist/src/commands/audit.d.ts +2 -0
  17. package/dist/src/commands/audit.js +132 -0
  18. package/dist/src/commands/audit.js.map +1 -0
  19. package/dist/src/commands/init-ci.d.ts +2 -0
  20. package/dist/src/commands/init-ci.js +71 -11
  21. package/dist/src/commands/init-ci.js.map +1 -1
  22. package/dist/src/commands/legacy.js +2 -0
  23. package/dist/src/commands/legacy.js.map +1 -1
  24. package/dist/src/commands/receipt.d.ts +2 -0
  25. package/dist/src/commands/receipt.js +113 -0
  26. package/dist/src/commands/receipt.js.map +1 -0
  27. package/dist/src/commands/scan.js +23 -5
  28. package/dist/src/commands/scan.js.map +1 -1
  29. package/dist/src/commands/score.js +63 -0
  30. package/dist/src/commands/score.js.map +1 -1
  31. package/dist/src/commands/setup-ci-conversion.d.ts +2 -1
  32. package/dist/src/commands/setup-ci-conversion.js +22 -8
  33. package/dist/src/commands/setup-ci-conversion.js.map +1 -1
  34. package/dist/src/commands/test.js +18 -1
  35. package/dist/src/commands/test.js.map +1 -1
  36. package/dist/src/findings.d.ts +1 -0
  37. package/dist/src/findings.js +1 -0
  38. package/dist/src/findings.js.map +1 -1
  39. package/dist/src/index.d.ts +2 -0
  40. package/dist/src/index.js +2 -0
  41. package/dist/src/index.js.map +1 -1
  42. package/dist/src/receipt.d.ts +100 -0
  43. package/dist/src/receipt.js +375 -0
  44. package/dist/src/receipt.js.map +1 -0
  45. package/dist/src/reporters/attack-sim.js +6 -1
  46. package/dist/src/reporters/attack-sim.js.map +1 -1
  47. package/dist/src/reporters/sarif.js +11 -1
  48. package/dist/src/reporters/sarif.js.map +1 -1
  49. package/dist/src/security-profiles.d.ts +13 -0
  50. package/dist/src/security-profiles.js +59 -0
  51. package/dist/src/security-profiles.js.map +1 -0
  52. package/dist/src/telemetry.d.ts +7 -0
  53. package/dist/src/telemetry.js.map +1 -1
  54. package/docs/10x-agentic-growth-sprint.md +47 -0
  55. package/docs/agent-ecosystem-promotion-plan.md +1 -1
  56. package/docs/agentic-contributor-outreach.md +52 -0
  57. package/docs/code-scanning-demo.md +2 -2
  58. package/docs/commercial-boundary.md +83 -0
  59. package/docs/contributor-proof-cards/README.md +1 -1
  60. package/docs/examples/nsa-mcp-audit-report.md +372 -0
  61. package/docs/examples/nsa-mcp-results.sarif +930 -0
  62. package/docs/examples/nsa-mcp-score.json +13 -0
  63. package/docs/feishu-lark-mcp.md +1 -1
  64. package/docs/github-code-scanning-for-mcp.md +1 -1
  65. package/docs/government-enterprise-pilot.md +93 -0
  66. package/docs/mcp-receipts.md +109 -0
  67. package/docs/mcp-server-safety-index.md +26 -25
  68. package/docs/nsa-mcp-audit-ci.md +88 -0
  69. package/docs/procurement-one-pager.md +74 -0
  70. package/docs/proof.md +2 -2
  71. package/docs/public-guidance-crosswalk.md +48 -0
  72. package/docs/safety-index/artifacts/antv-chart-server.json +41 -23
  73. package/docs/safety-index/artifacts/antv-chart-server.md +23 -10
  74. package/docs/safety-index/artifacts/browsermcp-server.json +38 -20
  75. package/docs/safety-index/artifacts/browsermcp-server.md +23 -10
  76. package/docs/safety-index/artifacts/context7-server.json +85 -28
  77. package/docs/safety-index/artifacts/context7-server.md +35 -22
  78. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +460 -36
  79. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +31 -18
  80. package/docs/safety-index/artifacts/everything-server.json +38 -20
  81. package/docs/safety-index/artifacts/everything-server.md +25 -12
  82. package/docs/safety-index/artifacts/executeautomation-playwright-server.json +155 -20
  83. package/docs/safety-index/artifacts/executeautomation-playwright-server.md +26 -13
  84. package/docs/safety-index/artifacts/filesystem-server.json +116 -22
  85. package/docs/safety-index/artifacts/filesystem-server.md +27 -14
  86. package/docs/safety-index/artifacts/kubernetes-server.json +252 -27
  87. package/docs/safety-index/artifacts/kubernetes-server.md +44 -18
  88. package/docs/safety-index/artifacts/memory-server.json +39 -21
  89. package/docs/safety-index/artifacts/memory-server.md +24 -11
  90. package/docs/safety-index/artifacts/opentofu-server.json +38 -20
  91. package/docs/safety-index/artifacts/opentofu-server.md +24 -11
  92. package/docs/safety-index/artifacts/playwright-mcp-server.json +140 -20
  93. package/docs/safety-index/artifacts/playwright-mcp-server.md +26 -13
  94. package/docs/safety-index/artifacts/promptopia-server.json +41 -23
  95. package/docs/safety-index/artifacts/promptopia-server.md +26 -13
  96. package/docs/safety-index/artifacts/puppeteer-server.json +77 -34
  97. package/docs/safety-index/artifacts/puppeteer-server.md +45 -32
  98. package/docs/safety-index/artifacts/ref-tools-server.json +38 -20
  99. package/docs/safety-index/artifacts/ref-tools-server.md +22 -9
  100. package/docs/safety-index/artifacts/sequential-thinking-server.json +39 -21
  101. package/docs/safety-index/artifacts/sequential-thinking-server.md +23 -10
  102. package/docs/security-due-diligence.md +87 -0
  103. package/docs/setup-ci-doctor.md +11 -1
  104. package/docs/tool-call-receipts.md +1 -2
  105. package/examples/insecure-mcp-server/mcp-observatory.target.json +13 -0
  106. package/examples/insecure-mcp-server/server.mjs +62 -0
  107. package/package.json +12 -1
  108. package/scripts/postinstall.mjs +22 -7
package/COMMERCIAL.md CHANGED
@@ -4,17 +4,37 @@ MCP Observatory is the CI and security gate for MCP servers before agents depend
4
4
 
5
5
  The open source CLI and MCP server remain free for local OSS use under the MIT license. Paid pilots are for production use cases where a team needs hosted reporting, private repository CI, security reports, certification, support, or fleet visibility.
6
6
 
7
- ## MCP Readiness Review
7
+ See the [open core and commercial boundary](./docs/commercial-boundary.md) for the explicit line between public evidence surfaces and proprietary intelligence/reporting workflows.
8
8
 
9
- The primary paid offer is a fixed-scope MCP Readiness Review starting at `$2,500`.
9
+ ## Open Core Boundary
10
10
 
11
- It includes CI rollout, SARIF/GitHub Code Scanning setup, private readiness reporting, prioritized remediation notes, and maintainer PR support for selected MCP servers.
11
+ MCP Observatory intentionally keeps the local evidence engine open: CLI checks, safe attack simulation, audit profiles, SARIF, GitHub Actions setup, artifact schemas, public health scores, and public Safety Index receipts.
12
+
13
+ Commercial value should stay in the private workflow around that evidence:
14
+
15
+ - hosted CI history and fleet visibility
16
+ - private repository and internal MCP reporting
17
+ - account/company intelligence derived from private telemetry
18
+ - proprietary portfolio risk ranking and lead prioritization
19
+ - buyer-ready evidence packs, remediation notes, and procurement deliverables
20
+ - runtime/flight-recorder storage, alerting, retention, and SIEM export
21
+
22
+ The public project should prove the method. Paid pilots should save production teams time and give them a defensible decision record.
23
+
24
+ ## MCP Attack Simulation Evidence Pack
25
+
26
+ The primary paid offer is a fixed-scope [MCP Attack Simulation Evidence Pack](./docs/attack-simulation-pilot.md) starting at `$15,000`.
27
+
28
+ It includes safe-mode MCP attack simulation, CI rollout, SARIF/GitHub Code Scanning setup, private evidence reporting, prioritized remediation notes, and maintainer PR support for selected MCP servers.
12
29
 
13
30
  These are starting points for current pilots, not permanent fixed plans. For public OSS users, the important part is simple: local CLI use remains free, and paid work is for private or production support needs.
14
31
 
15
32
  | Pilot | Starting Price | Best Fit |
16
33
  | --- | ---: | --- |
17
- | MCP Readiness Review | $2,500 | CI rollout, Code Scanning, private readiness report, and prioritized fixes |
34
+ | Attack Simulation Quickstart | $15,000 | One high-value MCP server or one team adopting MCP |
35
+ | Attack Simulation Evidence Pack | $25,000 | Up to 10 MCP servers, executive evidence packet, remediation notes, and CI rollout |
36
+ | Platform Attack Simulation Pilot | $50,000 | Multi-team MCP review, fleet inventory, recurring review plan, and stakeholder readout |
37
+ | MCP Readiness Review | $2,500 | Narrow CI rollout, Code Scanning, private readiness report, and prioritized fixes |
18
38
  | Team Pilot | $299/month | Small teams adding MCP regression checks to CI |
19
39
  | Business Pilot | $999/month | Private repos, recurring security reports, and shared reporting |
20
40
  | Enterprise Pilot | $3k/month | Private MCP readiness reports, support, and fleet visibility |
@@ -22,13 +42,14 @@ These are starting points for current pilots, not permanent fixed plans. For pub
22
42
 
23
43
  Contact: open a pilot request from the GitHub issue chooser.
24
44
 
25
- Primary pilot offer: private MCP readiness review + CI rollout + drift/security report.
45
+ Primary pilot offer: private MCP attack simulation evidence pack + CI rollout + SARIF/Code Scanning + drift/security report.
26
46
 
27
47
  ## Paid Production Use
28
48
 
29
49
  Paid pilots can include:
30
50
 
31
51
  - Hosted CI history and private-repo reporting
52
+ - Safe-mode MCP attack simulation and evidence packs
32
53
  - MCP security reports and controlled drift review
33
54
  - Fleet inventory across teams, repos, and environments
34
55
  - Static enterprise reports generated from existing run artifacts
package/README.md CHANGED
@@ -25,9 +25,27 @@
25
25
  [![mcp-observatory MCP server](https://glama.ai/mcp/servers/KryptosAI/mcp-observatory/badges/score.svg)](https://glama.ai/mcp/servers/KryptosAI/mcp-observatory)
26
26
  [![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](./CONTRIBUTORS.md)
27
27
 
28
- **The GitHub-native CI, SARIF, and security-readiness gate for MCP servers before agents depend on them.**
28
+ **MCP Observatory is a security release gate for MCP servers. It helps teams validate MCP servers before deployment into sensitive, regulated, or mission-critical agentic AI environments.**
29
29
 
30
- Agents should not depend on tools nobody tests. MCP Observatory turns a local MCP check into release-gate evidence maintainers already understand: GitHub Actions, security findings, schema drift detection, PR reports, score badges, agent-accessible diagnostics, and GitHub Code Scanning SARIF.
30
+ Agents should not depend on tools nobody tests. MCP Observatory turns a local MCP check into release-gate evidence maintainers and security teams already understand: profile-mapped audit reports, normalized findings, SARIF for GitHub Code Scanning, GitHub Actions gates, schema drift detection, trust status output, score badges, and agent-accessible diagnostics.
31
+
32
+ ```bash
33
+ npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format markdown --output mcp-audit.md
34
+ ```
35
+
36
+ Sample trust output:
37
+
38
+ ```json
39
+ {
40
+ "target_id": "my-mcp-server",
41
+ "profile": "nsa-mcp",
42
+ "score": 87,
43
+ "status": "needs_review",
44
+ "finding_count": 2
45
+ }
46
+ ```
47
+
48
+ The `nsa-mcp` profile is not an official certification. It maps MCP Observatory findings to practical control areas for sensitive environments: trust boundaries, tool permissions, tool description integrity, authentication, secrets exposure, schema validation, input validation, auditability, runtime safety, and supply chain.
31
49
 
32
50
  ## Trust Signals
33
51
 
@@ -41,19 +59,34 @@ Agents should not depend on tools nobody tests. MCP Observatory turns a local MC
41
59
 
42
60
  ## Try It
43
61
 
44
- Start with the homepage demo: safely simulate MCP attack-readiness for one server and emit SARIF evidence that maintainers can inspect in GitHub Code Scanning.
62
+ Run a buyer-ready MCP security audit:
63
+
64
+ ```bash
65
+ npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format markdown --output report.md
66
+ npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format sarif --output results.sarif
67
+ npx @kryptosai/mcp-observatory score npx -y my-mcp-server --profile nsa-mcp --format json
68
+ ```
69
+
70
+ Or start with the homepage demo: safely simulate MCP attack-readiness for one server, emit an action receipt, and produce SARIF evidence that maintainers can inspect in GitHub Code Scanning.
45
71
 
46
72
  ```bash
47
73
  npx @kryptosai/mcp-observatory attack-sim npx -y my-mcp-server --sarif attack-results.sarif
48
74
  ```
49
75
 
76
+ Emit the portable trust record:
77
+
78
+ ```bash
79
+ npx @kryptosai/mcp-observatory audit npx -y my-mcp-server --profile nsa-mcp --format json --output report.json --receipt receipt.json
80
+ npx @kryptosai/mcp-observatory receipt npx -y my-mcp-server --profile nsa-mcp --format markdown --output receipt.md
81
+ ```
82
+
50
83
  Then make the evidence repeatable in CI:
51
84
 
52
85
  ```bash
53
86
  npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif
54
87
  ```
55
88
 
56
- See the [MCP Attack Simulator](./docs/mcp-attack-simulator.md), [Tool-call receipts](./docs/tool-call-receipts.md), [MCP Receipt Graph](./docs/receipt-graph.md), [launch page](./docs/launch.md), [GitHub Code Scanning demo](./docs/code-scanning-demo.md), [GitHub Code Scanning for MCP servers](./docs/github-code-scanning-for-mcp.md), [sample safety reports](./docs/mcp-server-safety-index.md), and [reference evaluations](./docs/reference-evaluations.md).
89
+ See the [government and enterprise pilot brief](./docs/government-enterprise-pilot.md), [public guidance crosswalk](./docs/public-guidance-crosswalk.md), [procurement one-pager](./docs/procurement-one-pager.md), [security due diligence packet](./docs/security-due-diligence.md), [NSA-MCP audit CI guide](./docs/nsa-mcp-audit-ci.md), [example NSA-MCP audit report](./docs/examples/nsa-mcp-audit-report.md), [MCP Receipts](./docs/mcp-receipts.md), [MCP Attack Simulator](./docs/mcp-attack-simulator.md), [Tool-call receipts](./docs/tool-call-receipts.md), [MCP Receipt Graph](./docs/receipt-graph.md), [launch page](./docs/launch.md), [GitHub Code Scanning demo](./docs/code-scanning-demo.md), [GitHub Code Scanning for MCP servers](./docs/github-code-scanning-for-mcp.md), [sample safety reports](./docs/mcp-server-safety-index.md), and [reference evaluations](./docs/reference-evaluations.md).
57
90
 
58
91
  Want a receipt for a server your agent depends on? Comment on [Drop an MCP server, get a receipt #146](https://github.com/KryptosAI/mcp-observatory/issues/146) or use the [structured receipt request form](https://github.com/KryptosAI/mcp-observatory/issues/new?template=tool-call-receipt-request.yml). Public requests can become Safety Index entries, delta receipts, SARIF evidence, and maintainer CI conversations.
59
92
 
@@ -62,13 +95,17 @@ Want a receipt for a server your agent depends on? Comment on [Drop an MCP serve
62
95
  | Evidence | Where |
63
96
  |---|---|
64
97
  | Example GitHub Actions adoption | [`setup-ci --all`](./docs/setup-ci-doctor.md) and the generated workflow docs |
98
+ | NSA-MCP audit example | [Markdown report](./docs/examples/nsa-mcp-audit-report.md), [SARIF](./docs/examples/nsa-mcp-results.sarif), and [score JSON](./docs/examples/nsa-mcp-score.json) |
99
+ | Procurement and pilot packet | [Public guidance crosswalk](./docs/public-guidance-crosswalk.md), [procurement one-pager](./docs/procurement-one-pager.md), and [security due diligence](./docs/security-due-diligence.md) |
65
100
  | Attack simulation output | [MCP Attack Simulator](./docs/mcp-attack-simulator.md) |
101
+ | MCP receipts | [Portable trust receipts](./docs/mcp-receipts.md) |
66
102
  | Tool-call receipts | [Receipt standard](./docs/tool-call-receipts.md) for reproducible MCP evidence |
67
103
  | Receipt graph | [Server-to-evidence map](./docs/receipt-graph.md) for agent trust decisions |
68
104
  | SARIF / Code Scanning output | [GitHub Code Scanning demo](./docs/code-scanning-demo.md) |
69
105
  | Real MCP server evaluations | [MCP Server Safety Index](./docs/mcp-server-safety-index.md) |
70
106
  | Reference reports | [Reference evaluations](./docs/reference-evaluations.md) |
71
107
  | Maintainer and contributor proof | [MCP Observatory Contributors](./docs/contributor-recognition.md) |
108
+ | Open core boundary | [What is open vs. commercial](./docs/commercial-boundary.md) |
72
109
  | Security disclosure path | [SECURITY.md](./SECURITY.md) |
73
110
 
74
111
  Two more fast paths:
@@ -80,11 +117,19 @@ AI coding agents, agentic workflows, and rough PRs are welcome. Use the [10x Age
80
117
  Add MCP CI and Code Scanning in one command:
81
118
 
82
119
  ```bash
83
- npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif
120
+ npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif --schedule weekly
121
+ ```
122
+
123
+ Repair or upgrade an existing adoption kit:
124
+
125
+ ```bash
126
+ npx @kryptosai/mcp-observatory setup-ci --doctor --fix
84
127
  ```
85
128
 
86
129
  Installing MCP Observatory in an MCP server project also prints the exact CI setup command. Projects can opt into automatic workflow creation during install with [`mcpObservatory.autoSetupCi`](./docs/automatic-ci-integration.md).
87
130
 
131
+ Normal `scan` and `test` runs include safe attack-readiness simulation by default. Use `--no-attack-sim` only when you want the older compatibility-only path.
132
+
88
133
  Upload normalized MCP findings to GitHub Code Scanning when you want a security-native release gate:
89
134
 
90
135
  ```bash
@@ -122,6 +167,9 @@ MCP servers are becoming production dependencies. If agents rely on them, teams
122
167
  Observatory gives maintainers and teams:
123
168
 
124
169
  - **One-command CI setup** with `setup-ci --all`
170
+ - **Profile-mapped audits** with `audit --profile nsa-mcp`
171
+ - **MCP receipts** that package target, evidence, verdict, action, and reproduction commands
172
+ - **Action receipts** that say `allow`, `gate`, `rerun`, `quarantine`, or `escalate`
125
173
  - **GitHub PR comments** for compatibility, drift, and security findings
126
174
  - **GitHub Code Scanning SARIF** for normalized MCP findings
127
175
  - **Health score badges** for public trust signals
@@ -129,7 +177,7 @@ Observatory gives maintainers and teams:
129
177
  - **MCP server mode** so agents can inspect other MCP servers directly
130
178
  - **Production support path** for hosted history, private repo reporting, certification, support, and fleet visibility
131
179
 
132
- See the [launch page](./docs/launch.md), [GitHub Code Scanning for MCP servers](./docs/github-code-scanning-for-mcp.md), [Code Scanning demo](./docs/code-scanning-demo.md), [target gallery](./docs/target-gallery.md), [target registry](./docs/target-registry.md), [target contribution guide](./docs/target-contribution-guide.md), [MCP Observatory Contributors](./docs/contributor-recognition.md), [Agent Task Pack](./docs/agent-tasks.md), [Tool-call receipts](./docs/tool-call-receipts.md), [MCP Receipt Graph](./docs/receipt-graph.md), [`setup-ci --doctor`](./docs/setup-ci-doctor.md), [MCP server security field guide](./docs/mcp-security-field-guide.md), [Safety Methodology](./docs/methodology.md), [MCP Server Safety Index](./docs/mcp-server-safety-index.md), [June 2026 safety field report](./docs/mcp-safety-field-report-2026-06.md), [reference evaluations](./docs/reference-evaluations.md), [MCP lock files](./docs/mcp-lock-files.md), [public proof](./docs/proof.md), [campaign attribution](./docs/campaign-attribution.md), [local metrics dashboard](./docs/metrics-dashboard.md), and [commercial support](./COMMERCIAL.md).
180
+ See the [launch page](./docs/launch.md), [GitHub Code Scanning for MCP servers](./docs/github-code-scanning-for-mcp.md), [Code Scanning demo](./docs/code-scanning-demo.md), [target gallery](./docs/target-gallery.md), [target registry](./docs/target-registry.md), [target contribution guide](./docs/target-contribution-guide.md), [MCP Observatory Contributors](./docs/contributor-recognition.md), [Agent Task Pack](./docs/agent-tasks.md), [MCP Receipts](./docs/mcp-receipts.md), [Tool-call receipts](./docs/tool-call-receipts.md), [MCP Receipt Graph](./docs/receipt-graph.md), [`setup-ci --doctor`](./docs/setup-ci-doctor.md), [MCP server security field guide](./docs/mcp-security-field-guide.md), [Safety Methodology](./docs/methodology.md), [MCP Server Safety Index](./docs/mcp-server-safety-index.md), [June 2026 safety field report](./docs/mcp-safety-field-report-2026-06.md), [reference evaluations](./docs/reference-evaluations.md), [MCP lock files](./docs/mcp-lock-files.md), [public proof](./docs/proof.md), [campaign attribution](./docs/campaign-attribution.md), [local metrics dashboard](./docs/metrics-dashboard.md), [open core boundary](./docs/commercial-boundary.md), [MCP Attack Simulation Evidence Pack](./docs/attack-simulation-pilot.md), and [commercial support](./COMMERCIAL.md).
133
181
 
134
182
  ## For Security And Platform Teams
135
183
 
@@ -139,7 +187,9 @@ MCP Observatory gives security and platform teams MCP server CI, schema drift de
139
187
 
140
188
  ## Production Support
141
189
 
142
- Local OSS use stays free under MIT. Teams running MCP in production can use the [MCP Readiness Review](./docs/paid-pilot-offer.md) for CI rollout, SARIF/Code Scanning setup, private repo review, recurring security reports, certification review, support, and fleet visibility. The default package starts at `$2,500`.
190
+ Local OSS use stays free under MIT. Teams running MCP in production can use the [MCP Attack Simulation Evidence Pack](./docs/attack-simulation-pilot.md) for safe-mode attack simulation, SARIF/Code Scanning setup, CI rollout, private evidence reporting, and owner-ready remediation notes. Attack simulation packages start at `$15,000`; narrow readiness reviews start at `$2,500`.
191
+
192
+ The open source repo is the public evidence engine. Private telemetry intelligence, company/account prioritization, commercial ranking weights, hosted fleet workflows, and buyer-specific evidence packs stay outside the OSS package; see the [open core boundary](./docs/commercial-boundary.md).
143
193
 
144
194
  Run `npx @kryptosai/mcp-observatory cloud`, open a pilot request from the issue chooser, or see [COMMERCIAL.md](./COMMERCIAL.md). Also see [privacy and telemetry](./PRIVACY.md), [campaign attribution](./docs/campaign-attribution.md), and [terms for production use](./TERMS.md).
145
195
 
@@ -186,9 +236,9 @@ Or add it manually to your config:
186
236
 
187
237
  | Command | What it does |
188
238
  |---------|-------------|
189
- | `scan` | Auto-discover servers from config files and check them all (default) |
190
- | `scan deep` | Scan and also invoke safe tools to verify they execute |
191
- | `test <cmd>` / `test --target <file>` | Test a specific server by command or target config |
239
+ | `scan` | Auto-discover servers, check them, and run safe attack-readiness simulation by default |
240
+ | `scan deep` | Scan, run safe attack simulation, and also invoke safe tools to verify they execute |
241
+ | `test <cmd>` / `test --target <file>` | Test one server and emit an action receipt by command or target config |
192
242
  | `record <cmd>` | Record a server session to a cassette file for offline replay |
193
243
  | `replay <cassette>` | Replay a cassette offline — no live server needed |
194
244
  | `verify <cassette> <cmd>` | Verify a live server still matches a recorded cassette |
@@ -202,6 +252,7 @@ Or add it manually to your config:
202
252
  | `setup-ci` / `init-ci` | Create a GitHub Action and badge snippet for MCP compatibility/security checks |
203
253
  | `setup-ci --sarif` | Generate a workflow that uploads normalized findings to GitHub Code Scanning |
204
254
  | `setup-ci --doctor` | Inspect whether the repository has a complete CI adoption kit |
255
+ | `--no-attack-sim` | Opt out of the default safe attack simulation on `scan` or `test` |
205
256
  | `ci-report` | Generate CI report for GitHub issue creation |
206
257
  | `enterprise-report` | Generate a static production/security report from run artifacts |
207
258
  | `score <cmd>` | Score an MCP server's health (0-100) |
@@ -273,7 +324,7 @@ When you run `scan`, it looks for MCP configs in:
273
324
  Add Observatory to your MCP server's CI pipeline:
274
325
 
275
326
  ```bash
276
- npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server"
327
+ npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif --schedule weekly
277
328
  ```
278
329
 
279
330
  Check the adoption kit:
@@ -282,6 +333,8 @@ Check the adoption kit:
282
333
  npx @kryptosai/mcp-observatory setup-ci --doctor
283
334
  ```
284
335
 
336
+ Successful `test`, `run`, and single-target `scan` checks also offer to convert the passing result into a CI adoption kit. That automatic conversion enables SARIF/Code Scanning and weekly scheduled checks by default; pass `--no-ci-sarif` when you only want a conservative workflow without Code Scanning upload.
337
+
285
338
  Or create the workflow manually:
286
339
 
287
340
  ```yaml
@@ -297,7 +350,7 @@ jobs:
297
350
  runs-on: ubuntu-latest
298
351
  steps:
299
352
  - uses: actions/checkout@v4
300
- - uses: KryptosAI/mcp-observatory/action@v0.27.0
353
+ - uses: KryptosAI/mcp-observatory/action@v1.28.0
301
354
  with:
302
355
  command: npx -y my-mcp-server
303
356
  deep: true
@@ -0,0 +1,20 @@
1
+ import { type ObservatoryFindingSeverity } from "./findings.js";
2
+ import type { RunArtifact } from "./types.js";
3
+ export type ReceiptAction = "allow" | "gate" | "rerun" | "quarantine" | "escalate";
4
+ export declare function recommendedActionForFinding(input: {
5
+ attackClass?: string;
6
+ category?: string;
7
+ ruleId?: string;
8
+ severity?: ObservatoryFindingSeverity | "warning" | "error";
9
+ }): ReceiptAction;
10
+ export interface ActionReceipt {
11
+ action: ReceiptAction;
12
+ reason: string;
13
+ topFindings: Array<{
14
+ severity: ObservatoryFindingSeverity;
15
+ ruleId: string;
16
+ message: string;
17
+ }>;
18
+ }
19
+ export declare function buildActionReceipt(artifact: RunArtifact): ActionReceipt;
20
+ export declare function renderActionReceipt(artifact: RunArtifact): string;
@@ -0,0 +1,85 @@
1
+ import { extractObservatoryFindings } from "./findings.js";
2
+ const ACTION_RANK = {
3
+ allow: 0,
4
+ rerun: 1,
5
+ gate: 2,
6
+ quarantine: 3,
7
+ escalate: 4,
8
+ };
9
+ function stronger(a, b) {
10
+ return ACTION_RANK[a] >= ACTION_RANK[b] ? a : b;
11
+ }
12
+ function normalizeReceiptAction(value) {
13
+ return value === "allow" || value === "gate" || value === "rerun" || value === "quarantine" || value === "escalate"
14
+ ? value
15
+ : undefined;
16
+ }
17
+ export function recommendedActionForFinding(input) {
18
+ const severity = input.severity === "error" ? "high"
19
+ : input.severity === "warning" ? "medium"
20
+ : input.severity;
21
+ const ruleId = input.ruleId ?? "";
22
+ const attackClass = input.attackClass ?? "";
23
+ if (severity === "high" && (attackClass === "exfiltration-canary" ||
24
+ ruleId.includes("credential") ||
25
+ ruleId.includes("canary") ||
26
+ ruleId.includes("secret"))) {
27
+ return "escalate";
28
+ }
29
+ if (severity === "high" && input.category === "runtime")
30
+ return "rerun";
31
+ if (severity === "high" && (input.category === "attack-sim" || ruleId.includes("attack-sim")))
32
+ return "quarantine";
33
+ if (severity === "high")
34
+ return "gate";
35
+ if (severity === "medium" && attackClass === "contract-drift")
36
+ return "rerun";
37
+ if (severity === "medium")
38
+ return "gate";
39
+ if (severity === "low")
40
+ return "allow";
41
+ return "allow";
42
+ }
43
+ export function buildActionReceipt(artifact) {
44
+ if (artifact.fatalError) {
45
+ return {
46
+ action: "rerun",
47
+ reason: "The MCP server did not complete startup/readiness checks.",
48
+ topFindings: [{ severity: "high", ruleId: "mcp-observatory/run/fatal-error", message: artifact.fatalError.split("\n")[0] ?? artifact.fatalError }],
49
+ };
50
+ }
51
+ const findings = extractObservatoryFindings(artifact);
52
+ let action = artifact.gate === "pass" ? "allow" : "gate";
53
+ for (const finding of findings) {
54
+ const storedAction = normalizeReceiptAction(finding.recommendedAction);
55
+ const computedAction = recommendedActionForFinding({
56
+ attackClass: typeof finding.evidence?.["attackClass"] === "string" ? finding.evidence["attackClass"] : undefined,
57
+ category: finding.category,
58
+ ruleId: finding.ruleId,
59
+ severity: finding.severity,
60
+ });
61
+ action = stronger(action, storedAction ?? computedAction);
62
+ }
63
+ const severityRank = { high: 3, medium: 2, low: 1, info: 0 };
64
+ const topFindings = findings
65
+ .sort((a, b) => severityRank[b.severity] - severityRank[a.severity])
66
+ .slice(0, 3)
67
+ .map((finding) => ({ severity: finding.severity, ruleId: finding.ruleId, message: finding.message }));
68
+ const reason = topFindings[0]?.message ?? "No blocking MCP readiness findings were detected.";
69
+ return { action, reason, topFindings };
70
+ }
71
+ export function renderActionReceipt(artifact) {
72
+ const receipt = buildActionReceipt(artifact);
73
+ const lines = [
74
+ `Action Receipt: ${receipt.action}`,
75
+ `Reason: ${receipt.reason}`,
76
+ ];
77
+ if (receipt.topFindings.length > 0) {
78
+ lines.push("Top evidence:");
79
+ for (const finding of receipt.topFindings) {
80
+ lines.push(`- [${finding.severity}] ${finding.ruleId}: ${finding.message}`);
81
+ }
82
+ }
83
+ return lines.join("\n");
84
+ }
85
+ //# sourceMappingURL=action-receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-receipt.js","sourceRoot":"","sources":["../../src/action-receipt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { type SecurityControlArea, type SecurityProfile } from "./security-profiles.js";
2
+ import type { RunArtifact, TargetConfig } from "./types.js";
3
+ export type AuditSeverity = "info" | "low" | "medium" | "high" | "critical";
4
+ export type TrustStatus = "enterprise_ready" | "scanned" | "needs_review" | "high_risk" | "critical_risk";
5
+ export interface NormalizedSecurityFinding {
6
+ id: string;
7
+ check_id: string;
8
+ rule_id: string;
9
+ title: string;
10
+ description: string;
11
+ severity: AuditSeverity;
12
+ category: string;
13
+ target: {
14
+ target_id: string;
15
+ subject_type: string;
16
+ subject_name?: string;
17
+ };
18
+ evidence: Record<string, unknown>;
19
+ recommendation: string;
20
+ confidence: "low" | "medium" | "high";
21
+ fingerprint: string;
22
+ control_mappings: SecurityControlArea[];
23
+ generated_at: string;
24
+ }
25
+ export interface AuditSummary {
26
+ profile: string;
27
+ generated_at: string;
28
+ target_id: string;
29
+ score: number;
30
+ trust_status: TrustStatus;
31
+ finding_count: number;
32
+ pass_count: number;
33
+ warning_count: number;
34
+ fail_count: number;
35
+ severity_counts: Record<AuditSeverity, number>;
36
+ control_counts: Record<SecurityControlArea, number>;
37
+ }
38
+ export interface AuditReport {
39
+ report_type: "mcp-observatory-audit";
40
+ schema_version: "1.0.0";
41
+ profile: Pick<SecurityProfile, "id" | "title" | "description" | "disclaimer" | "controlAreas">;
42
+ artifact: RunArtifact;
43
+ summary: AuditSummary;
44
+ findings: NormalizedSecurityFinding[];
45
+ }
46
+ export interface AuditScore {
47
+ target_id: string;
48
+ profile: string;
49
+ score: number;
50
+ status: TrustStatus;
51
+ finding_count: number;
52
+ critical: number;
53
+ high: number;
54
+ medium: number;
55
+ low: number;
56
+ info: number;
57
+ generated_at: string;
58
+ }
59
+ export declare function buildAuditReport(artifact: RunArtifact, target: TargetConfig, profileId?: string): AuditReport;
60
+ export declare function runAudit(target: TargetConfig, profileId?: string): Promise<AuditReport>;
61
+ export declare function auditScore(report: AuditReport): AuditScore;
62
+ export declare function renderAuditMarkdown(report: AuditReport): string;
63
+ export declare function renderAuditSarif(report: AuditReport, artifactUri?: string): string;
64
+ export declare function resolveAuditTarget(input: string[]): Promise<TargetConfig>;