@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.
- package/COMMERCIAL.md +13 -9
- package/CONTRIBUTORS.md +39 -0
- package/PRIVACY.md +5 -5
- package/README.md +83 -30
- package/TERMS.md +1 -1
- package/dist/src/adapters/http.js +1 -5
- package/dist/src/adapters/http.js.map +1 -1
- package/dist/src/cassette.js +3 -2
- package/dist/src/cassette.js.map +1 -1
- package/dist/src/checks/attack-sim.d.ts +18 -0
- package/dist/src/checks/attack-sim.js +304 -0
- package/dist/src/checks/attack-sim.js.map +1 -0
- package/dist/src/checks/schema-quality.js +1 -0
- package/dist/src/checks/schema-quality.js.map +1 -1
- package/dist/src/ci-issue.js +4 -3
- package/dist/src/ci-issue.js.map +1 -1
- package/dist/src/cli.js +17 -3
- 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 +168 -0
- package/dist/src/commands/attack-sim.js.map +1 -0
- package/dist/src/commands/helpers.d.ts +3 -1
- package/dist/src/commands/helpers.js +2 -2
- package/dist/src/commands/helpers.js.map +1 -1
- package/dist/src/commands/init-ci.d.ts +3 -0
- package/dist/src/commands/init-ci.js +57 -11
- package/dist/src/commands/init-ci.js.map +1 -1
- package/dist/src/commands/legacy.js +24 -3
- package/dist/src/commands/legacy.js.map +1 -1
- package/dist/src/commands/scan.js +37 -10
- package/dist/src/commands/scan.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 +26 -0
- package/dist/src/commands/setup-ci-conversion.js +120 -0
- package/dist/src/commands/setup-ci-conversion.js.map +1 -0
- package/dist/src/commands/telemetry.js +20 -14
- package/dist/src/commands/telemetry.js.map +1 -1
- package/dist/src/commands/test.js +63 -4
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/findings.d.ts +20 -0
- package/dist/src/findings.js +272 -0
- package/dist/src/findings.js.map +1 -0
- package/dist/src/history.js +3 -2
- package/dist/src/history.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +3 -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/reporters/attack-sim.d.ts +2 -0
- package/dist/src/reporters/attack-sim.js +84 -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.d.ts +4 -1
- package/dist/src/reporters/sarif.js +58 -37
- 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/storage.d.ts +1 -0
- package/dist/src/storage.js +28 -2
- package/dist/src/storage.js.map +1 -1
- package/dist/src/telemetry.d.ts +6 -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/agent-ecosystem-promotion-plan.md +244 -0
- package/docs/agent-runtime-quickstart.md +98 -0
- package/docs/agent-tasks.md +95 -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/code-scanning-launch-outreach.md +55 -0
- package/docs/contributor-proof-cards/README.md +33 -0
- package/docs/contributor-recognition.md +92 -0
- package/docs/feishu-lark-mcp.md +3 -3
- package/docs/github-code-scanning-for-mcp.md +94 -0
- package/docs/launch.md +64 -0
- package/docs/mcp-attack-simulator.md +57 -0
- package/docs/mcp-server-safety-index.md +18 -12
- package/docs/metrics-dashboard.md +2 -2
- package/docs/openclaw-agent-template/SOUL.md +156 -0
- package/docs/proof.md +7 -4
- package/docs/receipt-graph.md +54 -0
- package/docs/safety-index/artifacts/antv-chart-server.json +21 -21
- package/docs/safety-index/artifacts/antv-chart-server.md +10 -10
- package/docs/safety-index/artifacts/browsermcp-server.json +17 -17
- package/docs/safety-index/artifacts/browsermcp-server.md +10 -10
- package/docs/safety-index/artifacts/context7-server.json +17 -17
- package/docs/safety-index/artifacts/context7-server.md +10 -10
- package/docs/safety-index/artifacts/cyanheads-git-mcp-server.json +2014 -0
- package/docs/safety-index/artifacts/cyanheads-git-mcp-server.md +163 -0
- package/docs/safety-index/artifacts/everything-server.json +131 -56
- package/docs/safety-index/artifacts/everything-server.md +24 -24
- package/docs/safety-index/artifacts/executeautomation-playwright-server.json +26 -18
- package/docs/safety-index/artifacts/executeautomation-playwright-server.md +10 -10
- package/docs/safety-index/artifacts/filesystem-server.json +128 -20
- package/docs/safety-index/artifacts/filesystem-server.md +10 -10
- 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 +1348 -0
- package/docs/safety-index/artifacts/kubernetes-server.md +150 -0
- package/docs/safety-index/artifacts/memory-server.json +75 -32
- package/docs/safety-index/artifacts/memory-server.md +35 -28
- package/docs/safety-index/artifacts/opentofu-server.json +25 -17
- package/docs/safety-index/artifacts/opentofu-server.md +11 -11
- package/docs/safety-index/artifacts/playwright-mcp-server.json +56 -20
- package/docs/safety-index/artifacts/playwright-mcp-server.md +12 -12
- package/docs/safety-index/artifacts/promptopia-server.json +28 -20
- package/docs/safety-index/artifacts/promptopia-server.md +11 -11
- package/docs/safety-index/artifacts/puppeteer-server.json +42 -30
- package/docs/safety-index/artifacts/puppeteer-server.md +28 -28
- package/docs/safety-index/artifacts/ref-tools-server.json +17 -17
- package/docs/safety-index/artifacts/ref-tools-server.md +9 -9
- package/docs/safety-index/artifacts/sequential-thinking-server.json +20 -21
- package/docs/safety-index/artifacts/sequential-thinking-server.md +10 -10
- package/docs/safety-index/targets.json +90 -14
- package/docs/setup-ci-doctor.md +2 -0
- package/docs/target-contribution-guide.md +139 -0
- package/docs/target-gallery.md +49 -0
- package/docs/target-registry.md +120 -0
- package/docs/tool-call-receipts.md +116 -0
- package/package.json +52 -9
- package/schemas/run-artifact.schema.json +1 -0
- package/scripts/postinstall.mjs +123 -0
- package/docs/certification-campaign-template.md +0 -181
- package/docs/certification-distribution.md +0 -145
- package/docs/certification-pr-campaign.md +0 -68
- package/docs/clone-to-ci-campaign.md +0 -62
- package/docs/directory-listing-copy.md +0 -85
- package/docs/distribution-launch.md +0 -76
- package/docs/ecosystem-distribution-kit.md +0 -79
- package/docs/enterprise-outreach-playbook.md +0 -83
- package/docs/paid-pilot-offer.md +0 -74
- package/docs/project-case-study.md +0 -140
- package/docs/public-post-drafts.md +0 -98
- 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.
|
|
4
|
-
"description": "
|
|
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.
|
|
110
|
-
"@typescript-eslint/eslint-plugin": "8.62.
|
|
111
|
-
"@typescript-eslint/parser": "8.62.
|
|
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.
|
|
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.
|
|
160
|
+
"typescript-eslint": "8.62.1",
|
|
118
161
|
"vitest": "4.1.9"
|
|
119
162
|
}
|
|
120
163
|
}
|
|
@@ -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
|
+
}
|