@kryptosai/mcp-observatory 0.26.1 → 0.28.0

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 (152) hide show
  1. package/COMMERCIAL.md +13 -9
  2. package/CONTRIBUTORS.md +39 -0
  3. package/PRIVACY.md +5 -5
  4. package/README.md +83 -30
  5. package/TERMS.md +1 -1
  6. package/dist/src/adapters/http.js +1 -5
  7. package/dist/src/adapters/http.js.map +1 -1
  8. package/dist/src/cassette.js +3 -2
  9. package/dist/src/cassette.js.map +1 -1
  10. package/dist/src/checks/attack-sim.d.ts +18 -0
  11. package/dist/src/checks/attack-sim.js +304 -0
  12. package/dist/src/checks/attack-sim.js.map +1 -0
  13. package/dist/src/checks/schema-quality.js +1 -0
  14. package/dist/src/checks/schema-quality.js.map +1 -1
  15. package/dist/src/ci-issue.js +4 -3
  16. package/dist/src/ci-issue.js.map +1 -1
  17. package/dist/src/cli.js +17 -3
  18. package/dist/src/cli.js.map +1 -1
  19. package/dist/src/commands/attack-sim.d.ts +2 -0
  20. package/dist/src/commands/attack-sim.js +168 -0
  21. package/dist/src/commands/attack-sim.js.map +1 -0
  22. package/dist/src/commands/helpers.d.ts +3 -1
  23. package/dist/src/commands/helpers.js +2 -2
  24. package/dist/src/commands/helpers.js.map +1 -1
  25. package/dist/src/commands/init-ci.d.ts +3 -0
  26. package/dist/src/commands/init-ci.js +57 -11
  27. package/dist/src/commands/init-ci.js.map +1 -1
  28. package/dist/src/commands/legacy.js +24 -3
  29. package/dist/src/commands/legacy.js.map +1 -1
  30. package/dist/src/commands/scan.js +37 -10
  31. package/dist/src/commands/scan.js.map +1 -1
  32. package/dist/src/commands/serve.js +9 -1
  33. package/dist/src/commands/serve.js.map +1 -1
  34. package/dist/src/commands/setup-ci-conversion.d.ts +26 -0
  35. package/dist/src/commands/setup-ci-conversion.js +120 -0
  36. package/dist/src/commands/setup-ci-conversion.js.map +1 -0
  37. package/dist/src/commands/telemetry.js +20 -14
  38. package/dist/src/commands/telemetry.js.map +1 -1
  39. package/dist/src/commands/test.js +63 -4
  40. package/dist/src/commands/test.js.map +1 -1
  41. package/dist/src/findings.d.ts +20 -0
  42. package/dist/src/findings.js +272 -0
  43. package/dist/src/findings.js.map +1 -0
  44. package/dist/src/history.js +3 -2
  45. package/dist/src/history.js.map +1 -1
  46. package/dist/src/index.d.ts +3 -0
  47. package/dist/src/index.js +3 -0
  48. package/dist/src/index.js.map +1 -1
  49. package/dist/src/integrations/smithery.js +5 -1
  50. package/dist/src/integrations/smithery.js.map +1 -1
  51. package/dist/src/reporters/attack-sim.d.ts +2 -0
  52. package/dist/src/reporters/attack-sim.js +84 -0
  53. package/dist/src/reporters/attack-sim.js.map +1 -0
  54. package/dist/src/reporters/pr-comment.js +20 -6
  55. package/dist/src/reporters/pr-comment.js.map +1 -1
  56. package/dist/src/reporters/sarif.d.ts +4 -1
  57. package/dist/src/reporters/sarif.js +58 -37
  58. package/dist/src/reporters/sarif.js.map +1 -1
  59. package/dist/src/runner.d.ts +3 -0
  60. package/dist/src/runner.js +5 -0
  61. package/dist/src/runner.js.map +1 -1
  62. package/dist/src/score.js +1 -1
  63. package/dist/src/score.js.map +1 -1
  64. package/dist/src/storage.d.ts +1 -0
  65. package/dist/src/storage.js +28 -2
  66. package/dist/src/storage.js.map +1 -1
  67. package/dist/src/telemetry.d.ts +6 -0
  68. package/dist/src/telemetry.js +17 -1
  69. package/dist/src/telemetry.js.map +1 -1
  70. package/dist/src/types.d.ts +1 -1
  71. package/dist/src/utils/files.d.ts +1 -0
  72. package/dist/src/utils/files.js +21 -0
  73. package/dist/src/utils/files.js.map +1 -0
  74. package/dist/src/utils/ids.js +18 -5
  75. package/dist/src/utils/ids.js.map +1 -1
  76. package/dist/src/utils/url.d.ts +2 -0
  77. package/dist/src/utils/url.js +15 -0
  78. package/dist/src/utils/url.js.map +1 -0
  79. package/dist/src/validate.js +1 -1
  80. package/dist/src/validate.js.map +1 -1
  81. package/docs/agent-ecosystem-promotion-plan.md +244 -0
  82. package/docs/agent-runtime-quickstart.md +98 -0
  83. package/docs/agent-tasks.md +95 -0
  84. package/docs/automatic-ci-integration.md +33 -0
  85. package/docs/campaign-attribution.md +58 -0
  86. package/docs/code-scanning-demo.md +57 -0
  87. package/docs/code-scanning-launch-outreach.md +55 -0
  88. package/docs/contributor-proof-cards/README.md +33 -0
  89. package/docs/contributor-recognition.md +92 -0
  90. package/docs/feishu-lark-mcp.md +3 -3
  91. package/docs/github-code-scanning-for-mcp.md +94 -0
  92. package/docs/launch.md +64 -0
  93. package/docs/mcp-attack-simulator.md +57 -0
  94. package/docs/mcp-server-safety-index.md +18 -12
  95. package/docs/metrics-dashboard.md +2 -2
  96. package/docs/openclaw-agent-template/SOUL.md +156 -0
  97. package/docs/proof.md +7 -4
  98. package/docs/receipt-graph.md +54 -0
  99. package/docs/safety-index/artifacts/antv-chart-server.json +21 -21
  100. package/docs/safety-index/artifacts/antv-chart-server.md +10 -10
  101. package/docs/safety-index/artifacts/browsermcp-server.json +17 -17
  102. package/docs/safety-index/artifacts/browsermcp-server.md +10 -10
  103. package/docs/safety-index/artifacts/context7-server.json +17 -17
  104. package/docs/safety-index/artifacts/context7-server.md +10 -10
  105. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +2014 -0
  106. package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +163 -0
  107. package/docs/safety-index/artifacts/everything-server.json +131 -56
  108. package/docs/safety-index/artifacts/everything-server.md +24 -24
  109. package/docs/safety-index/artifacts/executeautomation-playwright-server.json +26 -18
  110. package/docs/safety-index/artifacts/executeautomation-playwright-server.md +10 -10
  111. package/docs/safety-index/artifacts/filesystem-server.json +128 -20
  112. package/docs/safety-index/artifacts/filesystem-server.md +10 -10
  113. package/docs/safety-index/artifacts/kubernetes-server.attack.json +1559 -0
  114. package/docs/safety-index/artifacts/kubernetes-server.attack.md +43 -0
  115. package/docs/safety-index/artifacts/kubernetes-server.attack.sarif +2857 -0
  116. package/docs/safety-index/artifacts/kubernetes-server.json +1348 -0
  117. package/docs/safety-index/artifacts/kubernetes-server.md +150 -0
  118. package/docs/safety-index/artifacts/memory-server.json +75 -32
  119. package/docs/safety-index/artifacts/memory-server.md +35 -28
  120. package/docs/safety-index/artifacts/opentofu-server.json +25 -17
  121. package/docs/safety-index/artifacts/opentofu-server.md +11 -11
  122. package/docs/safety-index/artifacts/playwright-mcp-server.json +56 -20
  123. package/docs/safety-index/artifacts/playwright-mcp-server.md +12 -12
  124. package/docs/safety-index/artifacts/promptopia-server.json +28 -20
  125. package/docs/safety-index/artifacts/promptopia-server.md +11 -11
  126. package/docs/safety-index/artifacts/puppeteer-server.json +42 -30
  127. package/docs/safety-index/artifacts/puppeteer-server.md +28 -28
  128. package/docs/safety-index/artifacts/ref-tools-server.json +17 -17
  129. package/docs/safety-index/artifacts/ref-tools-server.md +9 -9
  130. package/docs/safety-index/artifacts/sequential-thinking-server.json +20 -21
  131. package/docs/safety-index/artifacts/sequential-thinking-server.md +10 -10
  132. package/docs/safety-index/targets.json +90 -14
  133. package/docs/setup-ci-doctor.md +2 -0
  134. package/docs/target-contribution-guide.md +139 -0
  135. package/docs/target-gallery.md +49 -0
  136. package/docs/target-registry.md +120 -0
  137. package/docs/tool-call-receipts.md +116 -0
  138. package/package.json +52 -9
  139. package/schemas/run-artifact.schema.json +1 -0
  140. package/scripts/postinstall.mjs +123 -0
  141. package/docs/certification-campaign-template.md +0 -181
  142. package/docs/certification-distribution.md +0 -145
  143. package/docs/certification-pr-campaign.md +0 -68
  144. package/docs/clone-to-ci-campaign.md +0 -62
  145. package/docs/directory-listing-copy.md +0 -85
  146. package/docs/distribution-launch.md +0 -76
  147. package/docs/ecosystem-distribution-kit.md +0 -79
  148. package/docs/enterprise-outreach-playbook.md +0 -83
  149. package/docs/paid-pilot-offer.md +0 -74
  150. package/docs/project-case-study.md +0 -140
  151. package/docs/public-post-drafts.md +0 -98
  152. package/docs/publish-readiness.md +0 -79
@@ -0,0 +1,139 @@
1
+ # Target Contribution Guide
2
+
3
+ This guide turns MCP Observatory contribution into one small, repeatable action: add one safe MCP server target.
4
+
5
+ ## The Goal
6
+
7
+ Add a target that another person or agent can reproduce later.
8
+
9
+ Success means:
10
+
11
+ - the command is public
12
+ - the command is safe to run in CI
13
+ - the target has a clear risk class
14
+ - generated evidence is checked in
15
+ - the PR is small enough to review quickly
16
+
17
+ ## Step 1: Pick A Candidate
18
+
19
+ Look for MCP servers in:
20
+
21
+ - GitHub repos with `mcp-server` or `model-context-protocol`
22
+ - npm packages ending in `-mcp` or `mcp-server`
23
+ - agent runtime docs that mention MCP tools
24
+ - existing issues where maintainers ask for compatibility evidence
25
+
26
+ Prefer targets with a simple command:
27
+
28
+ ```bash
29
+ npx -y package-name
30
+ ```
31
+
32
+ If a target needs a fixture, keep it harmless and checked in under `examples/`.
33
+
34
+ ## Step 2: Run A Quick Check
35
+
36
+ From the repo root:
37
+
38
+ ```bash
39
+ npx @kryptosai/mcp-observatory test npx -y package-name --security
40
+ ```
41
+
42
+ If that works, add the target to:
43
+
44
+ ```text
45
+ docs/safety-index/targets.json
46
+ ```
47
+
48
+ ## Step 3: Write Useful Metadata
49
+
50
+ Use plain language. The metadata should help an agent decide whether this tool is worth trusting.
51
+
52
+ - `riskClass`: what kind of power this server gives an agent
53
+ - `failureClass`: what kind of breakage would matter most
54
+ - `whyItMatters`: why agent users care
55
+ - `reproductionNotes`: how to run it safely
56
+
57
+ Examples:
58
+
59
+ ```text
60
+ Browser control
61
+ Browser/code execution boundary
62
+ Agents may use this to navigate pages and inspect web state.
63
+ Zero-config public package; security findings are policy-review prompts, not vulnerability claims.
64
+ ```
65
+
66
+ ## Step 4: Generate Evidence
67
+
68
+ Run:
69
+
70
+ ```bash
71
+ npm run safety-index
72
+ ```
73
+
74
+ This updates:
75
+
76
+ ```text
77
+ docs/mcp-server-safety-index.md
78
+ docs/safety-index/artifacts/<target-id>.json
79
+ docs/safety-index/artifacts/<target-id>.md
80
+ ```
81
+
82
+ ## Step 5: Validate
83
+
84
+ Run the fast checks:
85
+
86
+ ```bash
87
+ npm run lint
88
+ npm run typecheck
89
+ npm test -- tests/safety-index.test.ts
90
+ ```
91
+
92
+ Use broader checks for larger changes:
93
+
94
+ ```bash
95
+ npm test
96
+ npm run smoke
97
+ ```
98
+
99
+ ## Step 6: Open A Tight PR
100
+
101
+ Good PR title:
102
+
103
+ ```text
104
+ Add Safety Index target for Example MCP
105
+ ```
106
+
107
+ Good PR body:
108
+
109
+ ```md
110
+ ## Summary
111
+
112
+ - add a no-secret Safety Index target for Example MCP
113
+ - include generated JSON and Markdown evidence
114
+
115
+ ## Validation
116
+
117
+ - npm run safety-index
118
+ - npm run lint
119
+ - npm run typecheck
120
+ - npm test -- tests/safety-index.test.ts
121
+ ```
122
+
123
+ ## Maintainer Follow-Up
124
+
125
+ After the PR lands, you can ask the upstream maintainer:
126
+
127
+ ```md
128
+ I added a read-only MCP Observatory target for your MCP server so agent users can verify startup, schemas, and common safety footguns.
129
+
130
+ The check is local-first and does not require secrets. If you want, the same target can become an advisory GitHub Action or README badge.
131
+ ```
132
+
133
+ ## What Not To Do
134
+
135
+ - do not add broad scraping
136
+ - do not include secrets or private URLs
137
+ - do not run destructive tools
138
+ - do not combine many targets in one first PR
139
+ - do not frame warnings as vulnerabilities unless the evidence clearly supports that
@@ -0,0 +1,49 @@
1
+ # Target Gallery
2
+
3
+ The Target Gallery turns the Safety Index into a maintainer-friendly map of the MCP ecosystem. It is not a leaderboard. It groups examples by the kind of agent dependency risk they represent.
4
+
5
+ For reproducible evidence, see the [MCP Server Safety Index](./mcp-server-safety-index.md). For contributor credit attached to accepted targets, see [MCP Observatory Contributors](./contributor-recognition.md) and [Contributor Proof Cards](./contributor-proof-cards/).
6
+
7
+ ## Reference And Baseline Servers
8
+
9
+ | Target | Why Agents Care | Next Step |
10
+ | --- | --- | --- |
11
+ | Official everything server | Broad MCP protocol surface across tools, prompts, and resources | Keep as a baseline compatibility target |
12
+ | Official sequential thinking server | Small tool surface with readable schemas | Use as a simple CI starter target |
13
+ | Official memory server | Agent-facing persistent state | Watch schema and write boundaries |
14
+
15
+ ## Filesystem, Browser, And Execution Boundaries
16
+
17
+ | Target | Why Agents Care | Next Step |
18
+ | --- | --- | --- |
19
+ | Official filesystem server | File access boundaries need harmless test roots | Review path scope before production |
20
+ | BrowserMCP | Browser-control tools can affect live sessions | Add read-only CI before agent rollout |
21
+ | Microsoft Playwright MCP | Browser automation can cross into code execution policy | Treat findings as policy review prompts |
22
+ | Puppeteer MCP server | Browser automation needs clear execution boundaries | Keep intentional browser checks explicit |
23
+ | ExecuteAutomation Playwright MCP | Startup/listing reproducibility affects agent trust | Start with maintainer conversation |
24
+
25
+ ## Retrieval, Documentation, And Prompt Surfaces
26
+
27
+ | Target | Why Agents Care | Next Step |
28
+ | --- | --- | --- |
29
+ | Context7 | Retrieval tools can move untrusted text into agent context | Add drift and schema checks |
30
+ | Promptopia | Prompt/resource contracts shape agent behavior | Keep generated evidence current |
31
+ | Ref tools | Developer-tool inventory should stay stable | Add CI and badge proof |
32
+
33
+ ## Infrastructure And Artifact-Producing Tools
34
+
35
+ | Target | Why Agents Care | Next Step |
36
+ | --- | --- | --- |
37
+ | OpenTofu MCP server | Infrastructure tools can influence production changes | Run checks before unattended agents use it |
38
+ | AntV chart MCP server | Artifact-producing tools need clear schemas and outputs | Keep CI evidence public |
39
+
40
+ ## Add A Target
41
+
42
+ Use the [target contribution guide](./target-contribution-guide.md). The best target has a public package, no secrets, no paid dependency, and a harmless startup command.
43
+
44
+ ```bash
45
+ npm run safety-index
46
+ npm test -- tests/safety-index.test.ts
47
+ ```
48
+
49
+ Accepted target PRs can receive a Target Scout or Target Verifier role, an All Contributors entry, and a proof card under `docs/contributor-proof-cards/` that links to the merged PR and generated public evidence.
@@ -0,0 +1,120 @@
1
+ # MCP Target Registry
2
+
3
+ ```
4
+ ███╗ ███╗ ██████╗██████╗
5
+ ████╗ ████║██╔════╝██╔══██╗
6
+ ██╔████╔██║██║ ██████╔╝
7
+ ██║╚██╔╝██║██║ ██╔═══╝
8
+ ██║ ╚═╝ ██║╚██████╗██║
9
+ ╚═╝ ╚═╝ ╚═════╝╚═╝
10
+ O B S E R V A T O R Y
11
+ ```
12
+
13
+ The easiest way to help MCP Observatory grow is to add one safe MCP target.
14
+
15
+ A target is a public MCP server that can be installed, started, and evaluated without private credentials or destructive side effects. Each target teaches agents and maintainers what healthy MCP behavior looks like.
16
+
17
+ ## Why This Can Compound
18
+
19
+ Every accepted target creates several useful surfaces:
20
+
21
+ - a reproducible startup command
22
+ - a public safety-index row
23
+ - JSON and Markdown evidence artifacts
24
+ - a maintainer conversation starter
25
+ - a badge or CI adoption path
26
+ - contributor recognition and a proof-card link
27
+ - a small contribution that another agent can copy
28
+
29
+ That means one tiny PR can produce docs, evidence, search surface, backlinks, and future issues.
30
+
31
+ ## Registry Source
32
+
33
+ Current Safety Index targets live in:
34
+
35
+ ```text
36
+ docs/safety-index/targets.json
37
+ ```
38
+
39
+ Generated evidence lives in:
40
+
41
+ ```text
42
+ docs/safety-index/artifacts/
43
+ docs/mcp-server-safety-index.md
44
+ ```
45
+
46
+ ## Best Targets
47
+
48
+ Good first targets:
49
+
50
+ - start with `npx -y package-name` or another public no-secret command
51
+ - expose at least one real MCP tool, prompt, or resource
52
+ - avoid production accounts, OAuth, private tokens, and paid services
53
+ - use a harmless fixture directory when filesystem access is needed
54
+ - represent something agents actually use: browser, files, memory, docs, databases, search, code, CI, or infrastructure
55
+
56
+ Avoid targets that need:
57
+
58
+ - private OAuth
59
+ - live destructive actions
60
+ - paid-only APIs
61
+ - customer data
62
+ - private repositories
63
+ - long-running background services
64
+
65
+ ## Target Entry Shape
66
+
67
+ Add one object to `docs/safety-index/targets.json`:
68
+
69
+ ```json
70
+ {
71
+ "id": "example-server",
72
+ "name": "Example MCP Server",
73
+ "repo": "https://github.com/example/example-mcp",
74
+ "packageName": "example-mcp",
75
+ "category": "Developer Tools",
76
+ "command": "npx",
77
+ "args": ["-y", "example-mcp"],
78
+ "timeoutMs": 60000,
79
+ "riskClass": "Developer tool access",
80
+ "failureClass": "Startup/listing reproducibility",
81
+ "whyItMatters": "Agents may rely on this tool during coding workflows.",
82
+ "reproductionNotes": "Zero-config public package."
83
+ }
84
+ ```
85
+
86
+ ## Contributor Loop
87
+
88
+ 1. Pick one public MCP server.
89
+ 2. Confirm it starts without secrets.
90
+ 3. Add one target entry.
91
+ 4. Run the Safety Index locally.
92
+ 5. Open a small PR with the target and generated evidence.
93
+ 6. Add or request a contributor proof card.
94
+ 7. Optionally ask the maintainer if they want an Observatory badge or CI check.
95
+
96
+ Use the detailed walkthrough in [Target Contribution Guide](./target-contribution-guide.md).
97
+
98
+ Accepted target contributions can receive a role on [MCP Observatory Contributors](./contributor-recognition.md), an All Contributors entry, and a Markdown proof card under [`docs/contributor-proof-cards/`](./contributor-proof-cards/).
99
+
100
+ ## Contribution Queue
101
+
102
+ Ready-made target tasks live under the [`target-registry` label](https://github.com/KryptosAI/mcp-observatory/issues?q=is%3Aissue%20is%3Aopen%20label%3Atarget-registry). Pick one issue, make one small PR, and include generated evidence.
103
+
104
+ ## Maintainer-Friendly Ask
105
+
106
+ When contacting a maintainer, keep it concrete:
107
+
108
+ ```md
109
+ I added a read-only MCP Observatory target for this server so agent users can verify startup, listed tools/prompts/resources, schema shape, and common safety footguns.
110
+
111
+ It does not require an account, hosted service, or secrets. If you prefer a different safe startup command, I can adjust the target.
112
+ ```
113
+
114
+ ## Agent-Friendly Task
115
+
116
+ For autonomous coding agents:
117
+
118
+ ```text
119
+ Find one public MCP server with a no-secret startup command. Add a single Safety Index target entry, run npm run safety-index, and open a PR that includes the generated JSON/Markdown evidence.
120
+ ```
@@ -0,0 +1,116 @@
1
+ # Tool-Call Receipts
2
+
3
+ MCP servers need receipts, not badges.
4
+
5
+ A badge says a project wants trust. A receipt shows what was checked, what could have happened, what could not have happened, and which artifact a maintainer or security team can rerun.
6
+
7
+ Use this page when turning MCP Observatory results into Safety Index entries, maintainer PRs, SARIF uploads, proof cards, or private dependency reviews.
8
+
9
+ ## Receipt Fields
10
+
11
+ A useful receipt should identify:
12
+
13
+ | Field | Purpose |
14
+ | --- | --- |
15
+ | `maintainer` | Public project, package, or account responsible for the server. |
16
+ | `source` | Public repo, package, version, and safe startup command. |
17
+ | `observatory` | MCP Observatory version, command, mode, and report timestamp. |
18
+ | `capabilityEnvelope` | What the simulation could and could not access. |
19
+ | `call` | Tool-listing, schema, prompt, resource, or safe invocation surface inspected. |
20
+ | `reason` | Why the check matters for agents depending on the server. |
21
+ | `result` | Verdict, severity, normalized findings, and maintainer-facing recommendation. |
22
+ | `changedArtifact` | JSON, Markdown, SARIF, hash, or PR evidence generated from the run. |
23
+ | `baseline` | Previous run, lock file, or Safety Index entry used for drift comparison. |
24
+ | `safeModeConstraints` | Explicit limits proving the receipt did not run destructive probes. |
25
+
26
+ Example shape:
27
+
28
+ ```json
29
+ {
30
+ "maintainer": "Example MCP Server",
31
+ "source": {
32
+ "repo": "https://github.com/example/mcp-server",
33
+ "command": "npx -y example-mcp-server"
34
+ },
35
+ "observatory": {
36
+ "version": "0.28.0",
37
+ "mode": "safe",
38
+ "command": "mcp-observatory attack-sim npx -y example-mcp-server"
39
+ },
40
+ "capabilityEnvelope": {
41
+ "filesystem": "fixture-only",
42
+ "network": "not invoked",
43
+ "shell": "not available to probes",
44
+ "credentials": "none"
45
+ },
46
+ "call": {
47
+ "type": "tools/list"
48
+ },
49
+ "reason": "permission-boundary risk",
50
+ "result": {
51
+ "severity": "medium",
52
+ "evidence": "Tool schema accepts broad path input and advertises write behavior."
53
+ },
54
+ "changedArtifact": {
55
+ "json": "docs/safety-index/artifacts/example.attack.json",
56
+ "sarif": "docs/safety-index/artifacts/example.attack.sarif"
57
+ },
58
+ "baseline": {
59
+ "id": "previous-safety-index-run"
60
+ },
61
+ "safeModeConstraints": [
62
+ "No destructive tool calls",
63
+ "No external exfiltration",
64
+ "No credential probing",
65
+ "No writes outside checked-in fixtures"
66
+ ]
67
+ }
68
+ ```
69
+
70
+ ## Capability Envelope
71
+
72
+ Every public receipt should explain the boundary of the run. For agent safety, the absence of a dangerous capability is as important as the finding itself.
73
+
74
+ At minimum, state whether the run had access to:
75
+
76
+ - Filesystem writes or deletes
77
+ - Network calls
78
+ - Shell or process execution
79
+ - Credentials, tokens, cookies, or production services
80
+ - Real user data
81
+ - Fixture data only
82
+
83
+ For public Safety Index evidence, prefer `attack-sim --mode safe`, public packages, checked-in fixtures, and no-secret startup commands. If a server requires private credentials, keep that evidence out of the public index and treat it as a private readiness review.
84
+
85
+ ## How Observatory Produces Receipts
86
+
87
+ Use these commands as the receipt ladder:
88
+
89
+ ```bash
90
+ npx @kryptosai/mcp-observatory test npx -y my-mcp-server --json run-artifact.json --markdown run-report.md
91
+ npx @kryptosai/mcp-observatory attack-sim npx -y my-mcp-server --json attack-artifact.json --output attack-report.md --sarif attack-results.sarif
92
+ npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y my-mcp-server" --sarif
93
+ ```
94
+
95
+ The normal run artifact shows protocol readiness. The attack-sim artifact shows safe attack-readiness evidence for tool poisoning, exfiltration canaries, permission-boundary risk, and drift readiness. The CI setup turns the receipt into something a maintainer can keep rerunning.
96
+
97
+ ## Safety Index Rules
98
+
99
+ Public Safety Index entries must use:
100
+
101
+ - Public repos, public packages, or public startup commands
102
+ - Sanitized JSON, Markdown, and SARIF artifacts
103
+ - Safe-mode attack simulation only
104
+ - Maintainer-friendly recommendations
105
+ - No private telemetry, secrets, hostnames, customer data, emails, or unpublished claims
106
+
107
+ Rough PRs are welcome at intake. Published entries should be normalized into receipts a maintainer can reproduce.
108
+
109
+ ## Contributor Prompt
110
+
111
+ Use this when inviting agents, bot authors, and MCP maintainers to contribute:
112
+
113
+ ```text
114
+ Name one MCP server your agent depends on. I will help turn it into a reproducible tool-call receipt: safe startup command, run artifact, attack-sim evidence, SARIF, and a CI gate maintainers can review.
115
+ ```
116
+
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kryptosai/mcp-observatory",
3
- "version": "0.26.1",
4
- "description": "The CI and security gate for MCP servers before agents depend on them.",
3
+ "version": "0.28.0",
4
+ "description": "GitHub-native CI, SARIF, Code Scanning, and security gates for MCP servers before agents depend on them.",
5
5
  "mcpName": "io.github.KryptosAI/mcp-observatory",
6
6
  "license": "MIT",
7
7
  "type": "module",
@@ -33,10 +33,46 @@
33
33
  "README.md",
34
34
  "CLONED_THIS.md",
35
35
  "COMMERCIAL.md",
36
+ "CONTRIBUTORS.md",
36
37
  "PRIVACY.md",
37
38
  "TERMS.md",
38
39
  "LICENSE",
39
- "docs",
40
+ "docs/agent-runtime-quickstart.md",
41
+ "docs/agent-ecosystem-promotion-plan.md",
42
+ "docs/agent-tasks.md",
43
+ "docs/automatic-ci-integration.md",
44
+ "docs/architecture.md",
45
+ "docs/campaign-attribution.md",
46
+ "docs/code-scanning-demo.md",
47
+ "docs/code-scanning-launch-outreach.md",
48
+ "docs/compatibility.md",
49
+ "docs/contributor-proof-cards",
50
+ "docs/contributor-recognition.md",
51
+ "docs/decisions.md",
52
+ "docs/demo.svg",
53
+ "docs/feishu-lark-mcp.md",
54
+ "docs/github-code-scanning-for-mcp.md",
55
+ "docs/known-issues.md",
56
+ "docs/launch.md",
57
+ "docs/mcp-attack-simulator.md",
58
+ "docs/mcp-lock-files.md",
59
+ "docs/mcp-safety-field-report-2026-06.md",
60
+ "docs/mcp-safety-report-latest.md",
61
+ "docs/mcp-security-field-guide.md",
62
+ "docs/mcp-server-safety-index.md",
63
+ "docs/methodology.md",
64
+ "docs/metrics-dashboard.md",
65
+ "docs/openclaw-agent-template",
66
+ "docs/proof.md",
67
+ "docs/receipt-graph.md",
68
+ "docs/reference-evaluations.md",
69
+ "docs/safety-index",
70
+ "docs/setup-ci-doctor.md",
71
+ "docs/target-contribution-guide.md",
72
+ "docs/target-gallery.md",
73
+ "docs/target-registry.md",
74
+ "docs/tool-call-receipts.md",
75
+ "scripts/postinstall.mjs",
40
76
  "schemas"
41
77
  ],
42
78
  "scripts": {
@@ -52,11 +88,13 @@
52
88
  "safety-index": "tsx scripts/run-safety-index.ts",
53
89
  "lint": "eslint .",
54
90
  "prepack": "npm run build",
91
+ "postinstall": "node scripts/postinstall.mjs",
55
92
  "proof:refresh": "tsx scripts/refresh-proof-artifacts.ts",
56
93
  "release:prep": "node scripts/release.mjs",
57
94
  "certification:pr-body": "tsx scripts/print-certification-pr-body.ts",
58
95
  "typecheck": "tsc --noEmit -p tsconfig.json && npm --prefix api install && npm --prefix api run typecheck",
59
96
  "test": "vitest run",
97
+ "test:coverage": "vitest run --coverage",
60
98
  "validate:artifacts": "tsx scripts/validate-artifacts.ts",
61
99
  "verify:packed-install": "node scripts/verify-packed-install.mjs",
62
100
  "smoke": "npm run cli -- run --target tests/fixtures/sample-target-config.json && npm run cli -- diff tests/fixtures/sample-run-a.json tests/fixtures/sample-run-b.json",
@@ -85,6 +123,9 @@
85
123
  "mcp-monitoring",
86
124
  "security",
87
125
  "mcp-security",
126
+ "sarif",
127
+ "code-scanning",
128
+ "github-code-scanning",
88
129
  "ai-security",
89
130
  "supply-chain-security",
90
131
  "ci-cd",
@@ -95,7 +136,8 @@
95
136
  "enterprise-report",
96
137
  "feishu",
97
138
  "lark",
98
- "schema-drift"
139
+ "schema-drift",
140
+ "attack-simulation"
99
141
  ],
100
142
  "dependencies": {
101
143
  "@modelcontextprotocol/sdk": "^1.29.0",
@@ -106,15 +148,16 @@
106
148
  },
107
149
  "devDependencies": {
108
150
  "@eslint/js": "10.0.1",
109
- "@types/node": "26.0.0",
110
- "@typescript-eslint/eslint-plugin": "8.62.0",
111
- "@typescript-eslint/parser": "8.62.0",
151
+ "@types/node": "26.0.1",
152
+ "@typescript-eslint/eslint-plugin": "8.62.1",
153
+ "@typescript-eslint/parser": "8.62.1",
112
154
  "ajv": "8.20.0",
113
- "eslint": "10.5.0",
155
+ "eslint": "10.6.0",
114
156
  "globals": "17.7.0",
115
157
  "tsx": "4.22.4",
158
+ "@vitest/coverage-v8": "4.1.9",
116
159
  "typescript": "6.0.3",
117
- "typescript-eslint": "8.62.0",
160
+ "typescript-eslint": "8.62.1",
118
161
  "vitest": "4.1.9"
119
162
  }
120
163
  }
@@ -49,6 +49,7 @@
49
49
  "tools-invoke",
50
50
  "security",
51
51
  "security-lite",
52
+ "attack-sim",
52
53
  "conformance",
53
54
  "schema-quality"
54
55
  ]
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env node
2
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
7
+ const projectRoot = path.resolve(process.env.INIT_CWD || process.cwd());
8
+ const isSelfInstall = projectRoot === packageRoot || projectRoot.startsWith(`${packageRoot}${path.sep}`);
9
+ const disabled = process.env.MCP_OBSERVATORY_POSTINSTALL === "0" ||
10
+ process.env.MCP_OBSERVATORY_DISABLE_POSTINSTALL === "1";
11
+ const forceAuto = process.env.MCP_OBSERVATORY_AUTO_SETUP_CI === "1";
12
+ const isCi = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true";
13
+
14
+ function readJson(filePath) {
15
+ try {
16
+ return JSON.parse(readFileSync(filePath, "utf8"));
17
+ } catch {
18
+ return undefined;
19
+ }
20
+ }
21
+
22
+ function hasOwn(value, key) {
23
+ return Object.prototype.hasOwnProperty.call(value || {}, key);
24
+ }
25
+
26
+ function isLikelyMcpProject(pkg) {
27
+ const keywords = Array.isArray(pkg?.keywords) ? pkg.keywords.map(String) : [];
28
+ const deps = { ...(pkg?.dependencies || {}), ...(pkg?.devDependencies || {}), ...(pkg?.peerDependencies || {}) };
29
+ return Boolean(pkg?.mcpName) ||
30
+ keywords.some((keyword) => /^(mcp|mcp-server|model-context-protocol)$/i.test(keyword)) ||
31
+ hasOwn(deps, "@modelcontextprotocol/sdk") ||
32
+ Object.keys(pkg?.scripts || {}).some((name) => /(^|:)mcp($|:|-)/i.test(name));
33
+ }
34
+
35
+ function inferCommand(pkg, config) {
36
+ if (process.env.MCP_OBSERVATORY_TARGET_COMMAND) return process.env.MCP_OBSERVATORY_TARGET_COMMAND;
37
+ if (typeof config?.command === "string" && config.command.trim()) return config.command.trim();
38
+ const scripts = pkg?.scripts || {};
39
+ for (const name of ["mcp", "start:mcp", "server:mcp", "mcp:serve", "dev:mcp"]) {
40
+ if (typeof scripts[name] === "string") return `npm run ${name}`;
41
+ }
42
+ if (typeof pkg?.name === "string" && pkg.name.trim()) return `npx -y ${pkg.name}`;
43
+ return "npx -y <server-package>";
44
+ }
45
+
46
+ function yamlString(value) {
47
+ return JSON.stringify(value);
48
+ }
49
+
50
+ function yamlFor(command, sarif) {
51
+ return [
52
+ "name: MCP Observatory",
53
+ "",
54
+ "on:",
55
+ " pull_request:",
56
+ " push:",
57
+ " branches: [main]",
58
+ "",
59
+ "permissions:",
60
+ " contents: read",
61
+ ...(sarif ? [" security-events: write"] : []),
62
+ "",
63
+ "jobs:",
64
+ " mcp-observatory:",
65
+ " runs-on: ubuntu-latest",
66
+ " steps:",
67
+ " - uses: actions/checkout@v6",
68
+ " - uses: KryptosAI/mcp-observatory/action@v0.27.0",
69
+ " with:",
70
+ ` command: ${yamlString(command)}`,
71
+ " deep: true",
72
+ " security: true",
73
+ " comment-on-pr: false",
74
+ " set-status: false",
75
+ ...(sarif ? [" upload-sarif: true"] : []),
76
+ " # Generated by @kryptosai/mcp-observatory postinstall.",
77
+ "",
78
+ ].join("\n");
79
+ }
80
+
81
+ function writeCi(projectRoot, command, sarif) {
82
+ const workflowPath = path.join(projectRoot, ".github", "workflows", "mcp-observatory.yml");
83
+ mkdirSync(path.dirname(workflowPath), { recursive: true });
84
+ try {
85
+ writeFileSync(workflowPath, yamlFor(command, sarif), { encoding: "utf8", flag: "wx" });
86
+ return { status: "created", workflowPath };
87
+ } catch (error) {
88
+ if (error && typeof error === "object" && "code" in error && error.code === "EEXIST") {
89
+ return { status: "exists", workflowPath };
90
+ }
91
+ throw error;
92
+ }
93
+ }
94
+
95
+ function log(message) {
96
+ process.stderr.write(`${message}\n`);
97
+ }
98
+
99
+ try {
100
+ if (disabled || isSelfInstall || isCi) process.exit(0);
101
+
102
+ const pkg = readJson(path.join(projectRoot, "package.json"));
103
+ if (!pkg || !isLikelyMcpProject(pkg)) process.exit(0);
104
+
105
+ const config = pkg.mcpObservatory && typeof pkg.mcpObservatory === "object" ? pkg.mcpObservatory : {};
106
+ const command = inferCommand(pkg, config);
107
+ const sarif = config.sarif === true || process.env.MCP_OBSERVATORY_AUTO_SETUP_SARIF === "1";
108
+ const autoSetup = forceAuto || config.autoSetupCi === true;
109
+
110
+ if (autoSetup) {
111
+ const result = writeCi(projectRoot, command, sarif);
112
+ const relative = path.relative(projectRoot, result.workflowPath);
113
+ log(result.status === "created"
114
+ ? `MCP Observatory: created ${relative}. Verify with: npx @kryptosai/mcp-observatory setup-ci --doctor`
115
+ : `MCP Observatory: ${relative} already exists. Verify with: npx @kryptosai/mcp-observatory setup-ci --doctor`);
116
+ } else {
117
+ log(`MCP Observatory: CI ready. Run: npx @kryptosai/mcp-observatory setup-ci --all --command "${command.replaceAll("\"", "\\\"")}"${sarif ? " --sarif" : ""}`);
118
+ log("MCP Observatory: to auto-create CI on install, set package.json mcpObservatory.autoSetupCi=true.");
119
+ }
120
+ } catch (error) {
121
+ const message = error instanceof Error ? error.message : String(error);
122
+ log(`MCP Observatory: install-time CI helper skipped (${message}).`);
123
+ }