@kryptosai/mcp-observatory 0.28.0 → 1.28.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.
- package/COMMERCIAL.md +26 -5
- package/README.md +65 -12
- package/dist/src/action-receipt.d.ts +20 -0
- package/dist/src/action-receipt.js +85 -0
- package/dist/src/action-receipt.js.map +1 -0
- package/dist/src/audit.d.ts +64 -0
- package/dist/src/audit.js +359 -0
- package/dist/src/audit.js.map +1 -0
- package/dist/src/checks/attack-sim.d.ts +2 -0
- package/dist/src/checks/attack-sim.js +12 -0
- package/dist/src/checks/attack-sim.js.map +1 -1
- package/dist/src/cli.js +8 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/attack-sim.js +54 -2
- package/dist/src/commands/attack-sim.js.map +1 -1
- package/dist/src/commands/audit.d.ts +2 -0
- package/dist/src/commands/audit.js +132 -0
- package/dist/src/commands/audit.js.map +1 -0
- package/dist/src/commands/init-ci.d.ts +2 -0
- package/dist/src/commands/init-ci.js +71 -11
- package/dist/src/commands/init-ci.js.map +1 -1
- package/dist/src/commands/legacy.js +2 -0
- package/dist/src/commands/legacy.js.map +1 -1
- package/dist/src/commands/receipt.d.ts +2 -0
- package/dist/src/commands/receipt.js +113 -0
- package/dist/src/commands/receipt.js.map +1 -0
- package/dist/src/commands/scan.js +23 -5
- package/dist/src/commands/scan.js.map +1 -1
- package/dist/src/commands/score.js +63 -0
- package/dist/src/commands/score.js.map +1 -1
- package/dist/src/commands/setup-ci-conversion.d.ts +2 -1
- package/dist/src/commands/setup-ci-conversion.js +22 -8
- package/dist/src/commands/setup-ci-conversion.js.map +1 -1
- package/dist/src/commands/test.js +18 -1
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/findings.d.ts +1 -0
- package/dist/src/findings.js +1 -0
- package/dist/src/findings.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/receipt.d.ts +100 -0
- package/dist/src/receipt.js +375 -0
- package/dist/src/receipt.js.map +1 -0
- package/dist/src/reporters/attack-sim.js +6 -1
- package/dist/src/reporters/attack-sim.js.map +1 -1
- package/dist/src/reporters/sarif.js +11 -1
- package/dist/src/reporters/sarif.js.map +1 -1
- package/dist/src/security-profiles.d.ts +13 -0
- package/dist/src/security-profiles.js +59 -0
- package/dist/src/security-profiles.js.map +1 -0
- package/dist/src/telemetry.d.ts +7 -0
- package/dist/src/telemetry.js.map +1 -1
- package/docs/10x-agentic-growth-sprint.md +47 -0
- package/docs/agent-ecosystem-promotion-plan.md +1 -1
- package/docs/agentic-contributor-outreach.md +52 -0
- package/docs/code-scanning-demo.md +2 -2
- package/docs/commercial-boundary.md +83 -0
- package/docs/contributor-proof-cards/README.md +1 -1
- package/docs/examples/nsa-mcp-audit-report.md +372 -0
- package/docs/examples/nsa-mcp-results.sarif +930 -0
- package/docs/examples/nsa-mcp-score.json +13 -0
- package/docs/feishu-lark-mcp.md +1 -1
- package/docs/github-code-scanning-for-mcp.md +1 -1
- package/docs/government-enterprise-pilot.md +93 -0
- package/docs/mcp-receipts.md +109 -0
- package/docs/mcp-server-safety-index.md +26 -25
- package/docs/nsa-mcp-audit-ci.md +88 -0
- package/docs/procurement-one-pager.md +74 -0
- package/docs/proof.md +2 -2
- package/docs/public-guidance-crosswalk.md +48 -0
- package/docs/safety-index/artifacts/antv-chart-server.json +41 -23
- package/docs/safety-index/artifacts/antv-chart-server.md +23 -10
- package/docs/safety-index/artifacts/browsermcp-server.json +38 -20
- package/docs/safety-index/artifacts/browsermcp-server.md +23 -10
- package/docs/safety-index/artifacts/context7-server.json +85 -28
- package/docs/safety-index/artifacts/context7-server.md +35 -22
- package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +460 -36
- package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +31 -18
- package/docs/safety-index/artifacts/everything-server.json +38 -20
- package/docs/safety-index/artifacts/everything-server.md +25 -12
- package/docs/safety-index/artifacts/executeautomation-playwright-server.json +155 -20
- package/docs/safety-index/artifacts/executeautomation-playwright-server.md +26 -13
- package/docs/safety-index/artifacts/filesystem-server.json +116 -22
- package/docs/safety-index/artifacts/filesystem-server.md +27 -14
- package/docs/safety-index/artifacts/kubernetes-server.json +252 -27
- package/docs/safety-index/artifacts/kubernetes-server.md +44 -18
- package/docs/safety-index/artifacts/memory-server.json +39 -21
- package/docs/safety-index/artifacts/memory-server.md +24 -11
- package/docs/safety-index/artifacts/opentofu-server.json +38 -20
- package/docs/safety-index/artifacts/opentofu-server.md +24 -11
- package/docs/safety-index/artifacts/playwright-mcp-server.json +140 -20
- package/docs/safety-index/artifacts/playwright-mcp-server.md +26 -13
- package/docs/safety-index/artifacts/promptopia-server.json +41 -23
- package/docs/safety-index/artifacts/promptopia-server.md +26 -13
- package/docs/safety-index/artifacts/puppeteer-server.json +77 -34
- package/docs/safety-index/artifacts/puppeteer-server.md +45 -32
- package/docs/safety-index/artifacts/ref-tools-server.json +38 -20
- package/docs/safety-index/artifacts/ref-tools-server.md +22 -9
- package/docs/safety-index/artifacts/sequential-thinking-server.json +39 -21
- package/docs/safety-index/artifacts/sequential-thinking-server.md +23 -10
- package/docs/security-due-diligence.md +87 -0
- package/docs/setup-ci-doctor.md +11 -1
- package/docs/tool-call-receipts.md +1 -2
- package/examples/insecure-mcp-server/mcp-observatory.target.json +13 -0
- package/examples/insecure-mcp-server/server.mjs +62 -0
- package/package.json +12 -1
- 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
|
-
|
|
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
|
-
|
|
9
|
+
## Open Core Boundary
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
|
|
|
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
|
|
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
|
[](https://glama.ai/mcp/servers/KryptosAI/mcp-observatory)
|
|
26
26
|
[](./CONTRIBUTORS.md)
|
|
27
27
|
|
|
28
|
-
**
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
|
190
|
-
| `scan deep` | Scan and also invoke safe tools to verify they execute |
|
|
191
|
-
| `test <cmd>` / `test --target <file>` | Test
|
|
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@
|
|
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":"AAAA,OAAO,EAAE,0BAA0B,EAAmC,MAAM,eAAe,CAAC;AAK5F,MAAM,WAAW,GAAkC;IACjD,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;IACb,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,SAAS,QAAQ,CAAC,CAAgB,EAAE,CAAgB;IAClD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,UAAU;QACjH,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAK3C;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM;QAClD,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ;YACzC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;IACnB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5C,IAAI,QAAQ,KAAK,MAAM,IAAI,CACzB,WAAW,KAAK,qBAAqB;QACrC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC7B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC1B,EAAE,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACxE,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IACnH,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,QAAQ,KAAK,QAAQ,IAAI,WAAW,KAAK,gBAAgB;QAAE,OAAO,OAAO,CAAC;IAC9E,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO,OAAO,CAAC;AACjB,CAAC;AAQD,MAAM,UAAU,kBAAkB,CAAC,QAAqB;IACtD,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,2DAA2D;YACnE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iCAAiC,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;SACnJ,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,MAAM,GAAkB,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,2BAA2B,CAAC;YACjD,WAAW,EAAE,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;YAChH,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QACH,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,IAAI,cAAc,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,YAAY,GAA+C,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACzG,MAAM,WAAW,GAAG,QAAQ;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;SACnE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxG,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,mDAAmD,CAAC;IAE9F,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAqB;IACvD,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG;QACZ,mBAAmB,OAAO,CAAC,MAAM,EAAE;QACnC,WAAW,OAAO,CAAC,MAAM,EAAE;KAC5B,CAAC;IACF,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -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>;
|