@kryptosai/mcp-observatory 0.27.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 +28 -2
- package/CONTRIBUTORS.md +39 -0
- package/README.md +114 -22
- 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/adapters/http.js +1 -5
- package/dist/src/adapters/http.js.map +1 -1
- 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/cassette.js +3 -2
- package/dist/src/cassette.js.map +1 -1
- package/dist/src/checks/attack-sim.d.ts +20 -0
- package/dist/src/checks/attack-sim.js +316 -0
- package/dist/src/checks/attack-sim.js.map +1 -0
- package/dist/src/ci-issue.js +4 -3
- package/dist/src/ci-issue.js.map +1 -1
- package/dist/src/cli.js +25 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/attack-sim.d.ts +2 -0
- package/dist/src/commands/attack-sim.js +220 -0
- package/dist/src/commands/attack-sim.js.map +1 -0
- 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 +3 -0
- package/dist/src/commands/init-ci.js +78 -13
- package/dist/src/commands/init-ci.js.map +1 -1
- package/dist/src/commands/legacy.js +8 -1
- 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 +30 -6
- 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/serve.js +9 -1
- package/dist/src/commands/serve.js.map +1 -1
- package/dist/src/commands/setup-ci-conversion.d.ts +3 -1
- package/dist/src/commands/setup-ci-conversion.js +23 -8
- package/dist/src/commands/setup-ci-conversion.js.map +1 -1
- package/dist/src/commands/telemetry.js +20 -14
- package/dist/src/commands/telemetry.js.map +1 -1
- package/dist/src/commands/test.js +31 -2
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/findings.d.ts +1 -0
- package/dist/src/findings.js +42 -1
- package/dist/src/findings.js.map +1 -1
- package/dist/src/history.js +3 -2
- package/dist/src/history.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/smithery.js +5 -1
- package/dist/src/integrations/smithery.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.d.ts +2 -0
- package/dist/src/reporters/attack-sim.js +89 -0
- package/dist/src/reporters/attack-sim.js.map +1 -0
- package/dist/src/reporters/pr-comment.js +20 -6
- package/dist/src/reporters/pr-comment.js.map +1 -1
- package/dist/src/reporters/sarif.js +11 -1
- package/dist/src/reporters/sarif.js.map +1 -1
- package/dist/src/runner.d.ts +3 -0
- package/dist/src/runner.js +5 -0
- package/dist/src/runner.js.map +1 -1
- package/dist/src/score.js +1 -1
- package/dist/src/score.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/storage.js +3 -2
- package/dist/src/storage.js.map +1 -1
- package/dist/src/telemetry.d.ts +10 -0
- package/dist/src/telemetry.js +17 -1
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/utils/files.d.ts +1 -0
- package/dist/src/utils/files.js +21 -0
- package/dist/src/utils/files.js.map +1 -0
- package/dist/src/utils/ids.js +18 -5
- package/dist/src/utils/ids.js.map +1 -1
- package/dist/src/utils/url.d.ts +2 -0
- package/dist/src/utils/url.js +15 -0
- package/dist/src/utils/url.js.map +1 -0
- package/dist/src/validate.js +1 -1
- package/dist/src/validate.js.map +1 -1
- package/docs/10x-agentic-growth-sprint.md +47 -0
- package/docs/agent-ecosystem-promotion-plan.md +244 -0
- package/docs/agent-tasks.md +95 -0
- package/docs/agentic-contributor-outreach.md +52 -0
- package/docs/automatic-ci-integration.md +33 -0
- package/docs/campaign-attribution.md +58 -0
- package/docs/code-scanning-demo.md +57 -0
- package/docs/commercial-boundary.md +83 -0
- package/docs/contributor-proof-cards/README.md +33 -0
- package/docs/contributor-recognition.md +92 -0
- 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/launch.md +64 -0
- package/docs/mcp-attack-simulator.md +57 -0
- package/docs/mcp-receipts.md +109 -0
- package/docs/mcp-server-safety-index.md +29 -22
- package/docs/nsa-mcp-audit-ci.md +88 -0
- package/docs/procurement-one-pager.md +74 -0
- package/docs/proof.md +5 -2
- package/docs/public-guidance-crosswalk.md +48 -0
- package/docs/receipt-graph.md +54 -0
- package/docs/safety-index/artifacts/antv-chart-server.json +40 -22
- package/docs/safety-index/artifacts/antv-chart-server.md +22 -9
- package/docs/safety-index/artifacts/browsermcp-server.json +36 -18
- package/docs/safety-index/artifacts/browsermcp-server.md +22 -9
- package/docs/safety-index/artifacts/context7-server.json +83 -26
- package/docs/safety-index/artifacts/context7-server.md +33 -20
- package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +2438 -0
- package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +176 -0
- package/docs/safety-index/artifacts/everything-server.json +150 -57
- package/docs/safety-index/artifacts/everything-server.md +36 -23
- package/docs/safety-index/artifacts/executeautomation-playwright-server.json +162 -19
- package/docs/safety-index/artifacts/executeautomation-playwright-server.md +25 -12
- package/docs/safety-index/artifacts/filesystem-server.json +221 -19
- package/docs/safety-index/artifacts/filesystem-server.md +24 -11
- package/docs/safety-index/artifacts/kubernetes-server.attack.json +1559 -0
- package/docs/safety-index/artifacts/kubernetes-server.attack.md +43 -0
- package/docs/safety-index/artifacts/kubernetes-server.attack.sarif +2857 -0
- package/docs/safety-index/artifacts/kubernetes-server.json +1573 -0
- package/docs/safety-index/artifacts/kubernetes-server.md +176 -0
- package/docs/safety-index/artifacts/memory-server.json +93 -32
- package/docs/safety-index/artifacts/memory-server.md +45 -25
- package/docs/safety-index/artifacts/opentofu-server.json +44 -18
- package/docs/safety-index/artifacts/opentofu-server.md +23 -10
- package/docs/safety-index/artifacts/playwright-mcp-server.json +177 -21
- package/docs/safety-index/artifacts/playwright-mcp-server.md +27 -14
- package/docs/safety-index/artifacts/promptopia-server.json +45 -19
- package/docs/safety-index/artifacts/promptopia-server.md +21 -8
- package/docs/safety-index/artifacts/puppeteer-server.json +77 -22
- package/docs/safety-index/artifacts/puppeteer-server.md +28 -15
- package/docs/safety-index/artifacts/ref-tools-server.json +36 -18
- package/docs/safety-index/artifacts/ref-tools-server.md +21 -8
- package/docs/safety-index/artifacts/sequential-thinking-server.json +38 -21
- package/docs/safety-index/artifacts/sequential-thinking-server.md +22 -9
- package/docs/safety-index/targets.json +90 -14
- package/docs/security-due-diligence.md +87 -0
- package/docs/setup-ci-doctor.md +13 -1
- package/docs/target-gallery.md +49 -0
- package/docs/target-registry.md +5 -1
- package/docs/tool-call-receipts.md +115 -0
- package/examples/insecure-mcp-server/mcp-observatory.target.json +13 -0
- package/examples/insecure-mcp-server/server.mjs +62 -0
- package/package.json +31 -2
- package/schemas/run-artifact.schema.json +1 -0
- package/scripts/postinstall.mjs +138 -0
package/COMMERCIAL.md
CHANGED
|
@@ -4,12 +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
|
+
|
|
9
|
+
## Open Core Boundary
|
|
10
|
+
|
|
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.
|
|
8
29
|
|
|
9
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.
|
|
10
31
|
|
|
11
32
|
| Pilot | Starting Price | Best Fit |
|
|
12
33
|
| --- | ---: | --- |
|
|
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 |
|
|
13
38
|
| Team Pilot | $299/month | Small teams adding MCP regression checks to CI |
|
|
14
39
|
| Business Pilot | $999/month | Private repos, recurring security reports, and shared reporting |
|
|
15
40
|
| Enterprise Pilot | $3k/month | Private MCP readiness reports, support, and fleet visibility |
|
|
@@ -17,13 +42,14 @@ These are starting points for current pilots, not permanent fixed plans. For pub
|
|
|
17
42
|
|
|
18
43
|
Contact: open a pilot request from the GitHub issue chooser.
|
|
19
44
|
|
|
20
|
-
Primary pilot offer: private MCP
|
|
45
|
+
Primary pilot offer: private MCP attack simulation evidence pack + CI rollout + SARIF/Code Scanning + drift/security report.
|
|
21
46
|
|
|
22
47
|
## Paid Production Use
|
|
23
48
|
|
|
24
49
|
Paid pilots can include:
|
|
25
50
|
|
|
26
51
|
- Hosted CI history and private-repo reporting
|
|
52
|
+
- Safe-mode MCP attack simulation and evidence packs
|
|
27
53
|
- MCP security reports and controlled drift review
|
|
28
54
|
- Fleet inventory across teams, repos, and environments
|
|
29
55
|
- Static enterprise reports generated from existing run artifacts
|
package/CONTRIBUTORS.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Contributors
|
|
2
|
+
|
|
3
|
+
MCP Observatory uses the [All Contributors](https://allcontributors.org/) spec so code, docs, tests, target research, reviews, security findings, design, and maintainer feedback can all receive visible credit.
|
|
4
|
+
|
|
5
|
+
Official GitHub profile achievements are platform-controlled; this project does not award them. Instead, contributors get public proof: a role on the recognition page, an All Contributors entry, and a proof card or recognition link they can reference from a README or GitHub profile.
|
|
6
|
+
|
|
7
|
+
See the full recognition path in [MCP Observatory Contributors](./docs/contributor-recognition.md).
|
|
8
|
+
|
|
9
|
+
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
10
|
+
[](#contributors-)
|
|
11
|
+
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
12
|
+
|
|
13
|
+
## Contributors
|
|
14
|
+
|
|
15
|
+
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
16
|
+
<!-- prettier-ignore-start -->
|
|
17
|
+
<!-- markdownlint-disable -->
|
|
18
|
+
<table>
|
|
19
|
+
<tbody>
|
|
20
|
+
<tr>
|
|
21
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KryptosAI"><img src="https://avatars.githubusercontent.com/u/140749029?s=100" width="100px;" alt="William Weishuhn"/><br /><sub><b>William Weishuhn</b></sub></a><br /><a href="https://github.com/KryptosAI/mcp-observatory/commits?author=KryptosAI" title="Code">💻</a> <a href="https://github.com/KryptosAI/mcp-observatory/commits?author=KryptosAI" title="Documentation">📖</a> <a href="#ideas-KryptosAI" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-KryptosAI" title="Maintenance">🚧</a> <a href="https://github.com/KryptosAI/mcp-observatory/commits?author=KryptosAI" title="Tests">⚠️</a></td>
|
|
22
|
+
</tr>
|
|
23
|
+
</tbody>
|
|
24
|
+
</table>
|
|
25
|
+
|
|
26
|
+
<!-- markdownlint-restore -->
|
|
27
|
+
<!-- prettier-ignore-end -->
|
|
28
|
+
|
|
29
|
+
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
30
|
+
|
|
31
|
+
## Recognition Requests
|
|
32
|
+
|
|
33
|
+
After a useful contribution is merged or accepted, request credit in the PR or issue:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
@all-contributors please add @username for code, doc, test, ideas, review
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
If the bot is unavailable, open a small PR that updates `.all-contributorsrc`, this file, and any relevant proof card under `docs/contributor-proof-cards/`.
|
package/README.md
CHANGED
|
@@ -11,41 +11,125 @@
|
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
[](https://github.com/KryptosAI/mcp-observatory/actions/workflows/ci.yml)
|
|
14
|
+
[](https://github.com/KryptosAI/mcp-observatory/actions/workflows/codeql.yml)
|
|
15
|
+
[](https://github.com/KryptosAI/mcp-observatory/actions/workflows/coverage.yml)
|
|
16
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/KryptosAI/mcp-observatory)
|
|
17
|
+
[](./.github/dependabot.yml)
|
|
18
|
+
[](./.github/workflows/release.yml)
|
|
14
19
|
[](https://www.npmjs.com/package/@kryptosai/mcp-observatory)
|
|
15
|
-
[](https://www.npmjs.com/package/@kryptosai/mcp-observatory)
|
|
21
|
+
[](https://github.com/KryptosAI/mcp-observatory/stargazers)
|
|
16
22
|
[](./LICENSE)
|
|
17
23
|
[](./package.json)
|
|
18
24
|
[](https://smithery.ai/server/@kryptosai/mcp-observatory)
|
|
19
25
|
[](https://glama.ai/mcp/servers/KryptosAI/mcp-observatory)
|
|
26
|
+
[](./CONTRIBUTORS.md)
|
|
20
27
|
|
|
21
|
-
**
|
|
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.**
|
|
22
29
|
|
|
23
|
-
Agents should not depend on tools nobody tests. MCP Observatory
|
|
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.
|
|
24
31
|
|
|
25
|
-
|
|
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.
|
|
49
|
+
|
|
50
|
+
## Trust Signals
|
|
51
|
+
|
|
52
|
+
| Signal | What it means |
|
|
53
|
+
|---|---|
|
|
54
|
+
| CI + coverage | Typecheck, lint, tests, build, packed install, artifact validation, smoke test, and measured coverage run in GitHub Actions. |
|
|
55
|
+
| CodeQL + OpenSSF Scorecard | Static analysis and supply-chain posture are visible in GitHub-native security surfaces. |
|
|
56
|
+
| Dependabot | npm and GitHub Actions dependency updates are monitored weekly. |
|
|
57
|
+
| npm provenance workflow | Release automation is prepared for npm provenance through GitHub OIDC. |
|
|
58
|
+
| Security policy | Vulnerability reports go through private disclosure; see [SECURITY.md](./SECURITY.md). |
|
|
59
|
+
|
|
60
|
+
## Try It
|
|
61
|
+
|
|
62
|
+
Run a buyer-ready MCP security audit:
|
|
26
63
|
|
|
27
64
|
```bash
|
|
28
|
-
npx @kryptosai/mcp-observatory
|
|
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
|
|
29
68
|
```
|
|
30
69
|
|
|
31
|
-
Or
|
|
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.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npx @kryptosai/mcp-observatory attack-sim npx -y my-mcp-server --sarif attack-results.sarif
|
|
74
|
+
```
|
|
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
|
+
|
|
83
|
+
Then make the evidence repeatable in CI:
|
|
32
84
|
|
|
33
85
|
```bash
|
|
34
86
|
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif
|
|
35
87
|
```
|
|
36
88
|
|
|
37
|
-
See [GitHub Code Scanning for MCP servers](./docs/github-code-scanning-for-mcp.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).
|
|
90
|
+
|
|
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.
|
|
92
|
+
|
|
93
|
+
## Evidence You Can Inspect
|
|
94
|
+
|
|
95
|
+
| Evidence | Where |
|
|
96
|
+
|---|---|
|
|
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) |
|
|
100
|
+
| Attack simulation output | [MCP Attack Simulator](./docs/mcp-attack-simulator.md) |
|
|
101
|
+
| MCP receipts | [Portable trust receipts](./docs/mcp-receipts.md) |
|
|
102
|
+
| Tool-call receipts | [Receipt standard](./docs/tool-call-receipts.md) for reproducible MCP evidence |
|
|
103
|
+
| Receipt graph | [Server-to-evidence map](./docs/receipt-graph.md) for agent trust decisions |
|
|
104
|
+
| SARIF / Code Scanning output | [GitHub Code Scanning demo](./docs/code-scanning-demo.md) |
|
|
105
|
+
| Real MCP server evaluations | [MCP Server Safety Index](./docs/mcp-server-safety-index.md) |
|
|
106
|
+
| Reference reports | [Reference evaluations](./docs/reference-evaluations.md) |
|
|
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) |
|
|
109
|
+
| Security disclosure path | [SECURITY.md](./SECURITY.md) |
|
|
38
110
|
|
|
39
111
|
Two more fast paths:
|
|
40
112
|
|
|
41
|
-
Cloned this repo? Start here: [`CLONED_THIS.md`](./CLONED_THIS.md). Want to contribute? Add one server to the [MCP Target Registry](./docs/target-registry.md).
|
|
113
|
+
Cloned this repo? Start here: [`CLONED_THIS.md`](./CLONED_THIS.md). Want to contribute? Add one server to the [MCP Target Registry](./docs/target-registry.md), use the [Agent Task Pack](./docs/agent-tasks.md), and get public credit through [MCP Observatory Contributors](./docs/contributor-recognition.md).
|
|
114
|
+
|
|
115
|
+
AI coding agents, agentic workflows, and rough PRs are welcome. Use the [10x Agentic Growth Sprint](./docs/10x-agentic-growth-sprint.md), [Agentic Contributor Outreach](./docs/agentic-contributor-outreach.md), or open a `Contributor quest`, `Agentic contribution idea`, or [`Drop an MCP server, get a receipt`](./docs/drop-server-get-receipt.md) issue to suggest a target, prompt, docs fix, receipt, or `setup-ci --sarif` integration.
|
|
42
116
|
|
|
43
|
-
Add MCP CI in one command:
|
|
117
|
+
Add MCP CI and Code Scanning in one command:
|
|
44
118
|
|
|
45
119
|
```bash
|
|
46
|
-
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server"
|
|
120
|
+
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif --schedule weekly
|
|
47
121
|
```
|
|
48
122
|
|
|
123
|
+
Repair or upgrade an existing adoption kit:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npx @kryptosai/mcp-observatory setup-ci --doctor --fix
|
|
127
|
+
```
|
|
128
|
+
|
|
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).
|
|
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
|
+
|
|
49
133
|
Upload normalized MCP findings to GitHub Code Scanning when you want a security-native release gate:
|
|
50
134
|
|
|
51
135
|
```bash
|
|
@@ -74,6 +158,8 @@ Use it as a CLI, a GitHub Action, or an MCP server that lets your AI agent scan,
|
|
|
74
158
|
|
|
75
159
|
[](https://glama.ai/mcp/servers/KryptosAI/mcp-observatory)
|
|
76
160
|
|
|
161
|
+
The Glama card is an external MCP directory scorecard. Treat it as directory-level social proof; click through for the underlying category details before using it as a production approval signal.
|
|
162
|
+
|
|
77
163
|
## Why MCP Observatory
|
|
78
164
|
|
|
79
165
|
MCP servers are becoming production dependencies. If agents rely on them, teams need a way to catch broken tools, unsafe schemas, schema drift, slow responses, and security footguns before those failures reach users.
|
|
@@ -81,6 +167,9 @@ MCP servers are becoming production dependencies. If agents rely on them, teams
|
|
|
81
167
|
Observatory gives maintainers and teams:
|
|
82
168
|
|
|
83
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`
|
|
84
173
|
- **GitHub PR comments** for compatibility, drift, and security findings
|
|
85
174
|
- **GitHub Code Scanning SARIF** for normalized MCP findings
|
|
86
175
|
- **Health score badges** for public trust signals
|
|
@@ -88,19 +177,21 @@ Observatory gives maintainers and teams:
|
|
|
88
177
|
- **MCP server mode** so agents can inspect other MCP servers directly
|
|
89
178
|
- **Production support path** for hosted history, private repo reporting, certification, support, and fleet visibility
|
|
90
179
|
|
|
91
|
-
See [GitHub Code Scanning for MCP servers](./docs/github-code-scanning-for-mcp.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).
|
|
92
181
|
|
|
93
182
|
## For Security And Platform Teams
|
|
94
183
|
|
|
95
184
|
MCP servers are becoming part of the AI software supply chain. Agents need reliable, testable, auditable tools before those tools become dependencies in mission-critical workflows.
|
|
96
185
|
|
|
97
|
-
MCP Observatory gives security and platform teams MCP server CI, schema drift detection, security findings, SARIF/HTML/Markdown reports, GitHub Code Scanning upload, and a path toward certification or fleet visibility. Local OSS use stays free; production, private repo, and fleet usage can move through a paid
|
|
186
|
+
MCP Observatory gives security and platform teams MCP server CI, schema drift detection, security findings, SARIF/HTML/Markdown reports, GitHub Code Scanning upload, and a path toward certification or fleet visibility. Local OSS use stays free; production, private repo, and fleet usage can move through a paid MCP Readiness Review.
|
|
98
187
|
|
|
99
188
|
## Production Support
|
|
100
189
|
|
|
101
|
-
Local OSS use stays free under MIT. Teams running MCP in production can use [
|
|
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).
|
|
102
193
|
|
|
103
|
-
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) and [terms for production use](./TERMS.md).
|
|
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).
|
|
104
195
|
|
|
105
196
|
## Quick Start
|
|
106
197
|
|
|
@@ -145,9 +236,9 @@ Or add it manually to your config:
|
|
|
145
236
|
|
|
146
237
|
| Command | What it does |
|
|
147
238
|
|---------|-------------|
|
|
148
|
-
| `scan` | Auto-discover servers
|
|
149
|
-
| `scan deep` | Scan and also invoke safe tools to verify they execute |
|
|
150
|
-
| `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 |
|
|
151
242
|
| `record <cmd>` | Record a server session to a cassette file for offline replay |
|
|
152
243
|
| `replay <cassette>` | Replay a cassette offline — no live server needed |
|
|
153
244
|
| `verify <cassette> <cmd>` | Verify a live server still matches a recorded cassette |
|
|
@@ -161,6 +252,7 @@ Or add it manually to your config:
|
|
|
161
252
|
| `setup-ci` / `init-ci` | Create a GitHub Action and badge snippet for MCP compatibility/security checks |
|
|
162
253
|
| `setup-ci --sarif` | Generate a workflow that uploads normalized findings to GitHub Code Scanning |
|
|
163
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` |
|
|
164
256
|
| `ci-report` | Generate CI report for GitHub issue creation |
|
|
165
257
|
| `enterprise-report` | Generate a static production/security report from run artifacts |
|
|
166
258
|
| `score <cmd>` | Score an MCP server's health (0-100) |
|
|
@@ -232,7 +324,7 @@ When you run `scan`, it looks for MCP configs in:
|
|
|
232
324
|
Add Observatory to your MCP server's CI pipeline:
|
|
233
325
|
|
|
234
326
|
```bash
|
|
235
|
-
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
|
|
236
328
|
```
|
|
237
329
|
|
|
238
330
|
Check the adoption kit:
|
|
@@ -241,6 +333,8 @@ Check the adoption kit:
|
|
|
241
333
|
npx @kryptosai/mcp-observatory setup-ci --doctor
|
|
242
334
|
```
|
|
243
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
|
+
|
|
244
338
|
Or create the workflow manually:
|
|
245
339
|
|
|
246
340
|
```yaml
|
|
@@ -256,7 +350,7 @@ jobs:
|
|
|
256
350
|
runs-on: ubuntu-latest
|
|
257
351
|
steps:
|
|
258
352
|
- uses: actions/checkout@v4
|
|
259
|
-
- uses: KryptosAI/mcp-observatory/action@
|
|
353
|
+
- uses: KryptosAI/mcp-observatory/action@v1.28.0
|
|
260
354
|
with:
|
|
261
355
|
command: npx -y my-mcp-server
|
|
262
356
|
deep: true
|
|
@@ -362,9 +456,7 @@ Your agent gets 10 tools:
|
|
|
362
456
|
| `get_last_run` | Retrieve previous check results for a server |
|
|
363
457
|
| `suggest_servers` | Discover MCP servers that match your project stack |
|
|
364
458
|
|
|
365
|
-
An AI tool that checks other AI tools. It
|
|
366
|
-
|
|
367
|
-
<sub>* I'm a dude playing a dude disguised as another dude.</sub>
|
|
459
|
+
An AI tool that checks other AI tools. It is a tool testing tools that serve tools.
|
|
368
460
|
|
|
369
461
|
### Security
|
|
370
462
|
|
|
@@ -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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"}
|
|
@@ -18,8 +18,6 @@ export class HttpAdapter {
|
|
|
18
18
|
throw new Error(`Unsupported protocol "${url.protocol}" — only http: and https: are allowed.`);
|
|
19
19
|
}
|
|
20
20
|
const timeoutMs = target.timeoutMs ?? 15_000;
|
|
21
|
-
// Try streamable-http first, fall back to SSE
|
|
22
|
-
let connected = false;
|
|
23
21
|
let activeTransport;
|
|
24
22
|
try {
|
|
25
23
|
let transport = new StreamableHTTPClientTransport(url, { requestInit: { headers } });
|
|
@@ -27,19 +25,17 @@ export class HttpAdapter {
|
|
|
27
25
|
transport = new RecordingTransport(transport);
|
|
28
26
|
await client.connect(transport, { timeout: timeoutMs });
|
|
29
27
|
activeTransport = transport;
|
|
30
|
-
connected = true;
|
|
31
28
|
}
|
|
32
29
|
catch {
|
|
33
30
|
stderrLines.push("Streamable HTTP failed, falling back to SSE.");
|
|
34
31
|
}
|
|
35
|
-
if (!
|
|
32
|
+
if (!activeTransport) {
|
|
36
33
|
try {
|
|
37
34
|
let transport = new SSEClientTransport(url, { requestInit: { headers } });
|
|
38
35
|
if (options?.record)
|
|
39
36
|
transport = new RecordingTransport(transport);
|
|
40
37
|
await client.connect(transport, { timeout: timeoutMs });
|
|
41
38
|
activeTransport = transport;
|
|
42
|
-
connected = true;
|
|
43
39
|
}
|
|
44
40
|
catch (error) {
|
|
45
41
|
const rawMessage = errorMessage(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/adapters/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,OAAO,CAAC,MAAwB,EAAE,OAA+B;QACrE,MAAM,OAAO,GAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,SAAS,EAAE,CAAC;QAC1D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,EAClD,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QAEF,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,QAAQ,wCAAwC,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;QAE7C,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/adapters/http.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>;
|