@kryptosai/mcp-observatory 0.20.2 → 0.21.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 +67 -0
- package/PRIVACY.md +52 -0
- package/README.md +100 -4
- package/TERMS.md +30 -0
- package/dist/src/checks/resources.js +9 -19
- package/dist/src/checks/resources.js.map +1 -1
- package/dist/src/checks/security-rules.js.map +1 -1
- package/dist/src/checks/security.js +33 -14
- package/dist/src/checks/security.js.map +1 -1
- package/dist/src/checks/tools-invoke.js.map +1 -1
- package/dist/src/checks/tools.js.map +1 -1
- package/dist/src/ci-issue.js +3 -1
- package/dist/src/ci-issue.js.map +1 -1
- package/dist/src/cli.js +49 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/ci-report.js +4 -0
- package/dist/src/commands/ci-report.js.map +1 -1
- package/dist/src/commands/enterprise-report.d.ts +12 -0
- package/dist/src/commands/enterprise-report.js +192 -0
- package/dist/src/commands/enterprise-report.js.map +1 -0
- package/dist/src/commands/init-ci.d.ts +17 -0
- package/dist/src/commands/init-ci.js +106 -0
- package/dist/src/commands/init-ci.js.map +1 -0
- package/dist/src/commands/scan.js +4 -0
- package/dist/src/commands/scan.js.map +1 -1
- package/dist/src/commands/score.js +2 -0
- package/dist/src/commands/score.js.map +1 -1
- package/dist/src/commands/telemetry.js +47 -2
- package/dist/src/commands/telemetry.js.map +1 -1
- package/dist/src/commands/test.js +11 -5
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/commercial.d.ts +5 -0
- package/dist/src/commercial.js +46 -0
- package/dist/src/commercial.js.map +1 -0
- package/dist/src/runner.js +1 -1
- package/dist/src/runner.js.map +1 -1
- package/dist/src/telemetry.d.ts +27 -0
- package/dist/src/telemetry.js +57 -3
- package/dist/src/telemetry.js.map +1 -1
- package/dist/src/types.d.ts +5 -0
- package/dist/src/validate.js +48 -5
- package/dist/src/validate.js.map +1 -1
- package/docs/architecture.md +32 -0
- package/docs/certification-campaign-template.md +167 -0
- package/docs/certification-distribution.md +125 -0
- package/docs/compatibility.md +164 -0
- package/docs/decisions.md +23 -0
- package/docs/demo.svg +59 -0
- package/docs/directory-listing-copy.md +78 -0
- package/docs/distribution-launch.md +76 -0
- package/docs/enterprise-outreach-playbook.md +83 -0
- package/docs/feishu-lark-mcp.md +65 -0
- package/docs/known-issues.md +27 -0
- package/docs/mcp-safety-report-latest.md +85 -0
- package/docs/project-case-study.md +106 -0
- package/docs/proof.md +68 -0
- package/docs/publish-readiness.md +73 -0
- package/package.json +31 -18
- package/schemas/diff-artifact.schema.json +62 -66
- package/schemas/run-artifact.schema.json +107 -142
package/dist/src/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,GAA4B,EAAE,KAAa,EAAE,KAAa;IAC/E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,KAAK,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,GAA4B,EAAE,KAAa,EAAE,KAAa;IAC9E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,KAAK,wBAAwB,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAEhE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACxD,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,MAAM;YACf,GAAG;YACH,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
MCP Observatory is intentionally small. The core data flow is:
|
|
4
|
+
|
|
5
|
+
1. **Target config**
|
|
6
|
+
A JSON description of how to start a target via the local-process adapter.
|
|
7
|
+
2. **Adapter**
|
|
8
|
+
The adapter starts an MCP server over stdio and establishes a client session.
|
|
9
|
+
3. **Checks**
|
|
10
|
+
The runner executes `tools`, `prompts`, `resources`, and `semantics`.
|
|
11
|
+
4. **Run artifact**
|
|
12
|
+
Results are normalized into a stable, versioned JSON artifact with a top-level `gate`.
|
|
13
|
+
5. **Diff**
|
|
14
|
+
Two run artifacts can be compared to classify regressions and recoveries.
|
|
15
|
+
6. **Report**
|
|
16
|
+
Run or diff artifacts render as terminal output, JSON, or Markdown.
|
|
17
|
+
|
|
18
|
+
## Design Intent
|
|
19
|
+
|
|
20
|
+
- keep the adapter boundary obvious so more target types can be added later
|
|
21
|
+
- keep checks isolated and typed
|
|
22
|
+
- treat artifacts as product surfaces, not incidental output
|
|
23
|
+
- keep the Markdown report strong enough to stand on its own in issues, PRs, and CI
|
|
24
|
+
|
|
25
|
+
## Stability Surfaces
|
|
26
|
+
|
|
27
|
+
These are the most important surfaces to preserve carefully:
|
|
28
|
+
|
|
29
|
+
- artifact schema
|
|
30
|
+
- diff semantics
|
|
31
|
+
- `unsupported` vs `failed` interpretation
|
|
32
|
+
- Markdown report structure and usefulness
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# MCP Observatory Certification Campaign
|
|
2
|
+
|
|
3
|
+
Use this tracker for outbound PR waves against MCP server repositories.
|
|
4
|
+
|
|
5
|
+
## Campaign Goal
|
|
6
|
+
|
|
7
|
+
Open helpful PRs that add MCP Observatory CI checks and a public compatibility/security badge to popular MCP server projects.
|
|
8
|
+
|
|
9
|
+
One-shot campaign target:
|
|
10
|
+
|
|
11
|
+
- 50 researched repos
|
|
12
|
+
- 25 PRs opened
|
|
13
|
+
- 10 accepted checks or badges
|
|
14
|
+
- 5 public proof points added to launch materials
|
|
15
|
+
- 3 production/security pilot conversations started
|
|
16
|
+
|
|
17
|
+
## Qualification Rules
|
|
18
|
+
|
|
19
|
+
Prioritize:
|
|
20
|
+
|
|
21
|
+
- active MCP server repos
|
|
22
|
+
- clear install/run command
|
|
23
|
+
- recent commit or release in the last 90 days
|
|
24
|
+
- 100+ stars, meaningful npm downloads, directory popularity, or enterprise category
|
|
25
|
+
- developer tools, security, CI/CD, database, browser automation, SaaS, cloud, or finance servers
|
|
26
|
+
|
|
27
|
+
Skip:
|
|
28
|
+
|
|
29
|
+
- servers that require private credentials to start
|
|
30
|
+
- repos with destructive default tools
|
|
31
|
+
- abandoned repos unless they have major download volume
|
|
32
|
+
- projects that already have equivalent MCP compatibility/security CI
|
|
33
|
+
|
|
34
|
+
## Tracker
|
|
35
|
+
|
|
36
|
+
| Priority | Repo | Package/Command | Category | Stars/Downloads/Listing Signal | Activity Signal | Risk Notes | Status | PR URL | Accepted/Badge/Proof |
|
|
37
|
+
| ---: | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
38
|
+
| 1 | `owner/repo` | `npx -y package` | Security | | | | researched | | |
|
|
39
|
+
| 2 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
40
|
+
| 3 | `owner/repo` | `uvx package` | Browser Automation | | | | researched | | |
|
|
41
|
+
| 4 | `owner/repo` | `docker run image` | Database | | | | researched | | |
|
|
42
|
+
| 5 | `owner/repo` | `npx -y package` | Cloud | | | | researched | | |
|
|
43
|
+
| 6 | `owner/repo` | `npx -y package` | SaaS | | | | researched | | |
|
|
44
|
+
| 7 | `owner/repo` | `uvx package` | Finance | | | | researched | | |
|
|
45
|
+
| 8 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
46
|
+
| 9 | `owner/repo` | `npx -y package` | Security | | | | researched | | |
|
|
47
|
+
| 10 | `owner/repo` | `docker run image` | Infrastructure | | | | researched | | |
|
|
48
|
+
| 11 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
49
|
+
| 12 | `owner/repo` | `uvx package` | Data | | | | researched | | |
|
|
50
|
+
| 13 | `owner/repo` | `npx -y package` | Search | | | | researched | | |
|
|
51
|
+
| 14 | `owner/repo` | `npx -y package` | Filesystem | | | | researched | | |
|
|
52
|
+
| 15 | `owner/repo` | `docker run image` | Browser Automation | | | | researched | | |
|
|
53
|
+
| 16 | `owner/repo` | `npx -y package` | API | | | | researched | | |
|
|
54
|
+
| 17 | `owner/repo` | `uvx package` | Security | | | | researched | | |
|
|
55
|
+
| 18 | `owner/repo` | `npx -y package` | Database | | | | researched | | |
|
|
56
|
+
| 19 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
57
|
+
| 20 | `owner/repo` | `docker run image` | Cloud | | | | researched | | |
|
|
58
|
+
| 21 | `owner/repo` | `npx -y package` | SaaS | | | | researched | | |
|
|
59
|
+
| 22 | `owner/repo` | `uvx package` | Data | | | | researched | | |
|
|
60
|
+
| 23 | `owner/repo` | `npx -y package` | Security | | | | researched | | |
|
|
61
|
+
| 24 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
62
|
+
| 25 | `owner/repo` | `docker run image` | Infrastructure | | | | researched | | |
|
|
63
|
+
| 26 | `owner/repo` | `npx -y package` | Browser Automation | | | | researched | | |
|
|
64
|
+
| 27 | `owner/repo` | `uvx package` | API | | | | researched | | |
|
|
65
|
+
| 28 | `owner/repo` | `npx -y package` | Database | | | | researched | | |
|
|
66
|
+
| 29 | `owner/repo` | `npx -y package` | Search | | | | researched | | |
|
|
67
|
+
| 30 | `owner/repo` | `docker run image` | Cloud | | | | researched | | |
|
|
68
|
+
| 31 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
69
|
+
| 32 | `owner/repo` | `uvx package` | Security | | | | researched | | |
|
|
70
|
+
| 33 | `owner/repo` | `npx -y package` | SaaS | | | | researched | | |
|
|
71
|
+
| 34 | `owner/repo` | `npx -y package` | Data | | | | researched | | |
|
|
72
|
+
| 35 | `owner/repo` | `docker run image` | Infrastructure | | | | researched | | |
|
|
73
|
+
| 36 | `owner/repo` | `npx -y package` | Finance | | | | researched | | |
|
|
74
|
+
| 37 | `owner/repo` | `uvx package` | Browser Automation | | | | researched | | |
|
|
75
|
+
| 38 | `owner/repo` | `npx -y package` | API | | | | researched | | |
|
|
76
|
+
| 39 | `owner/repo` | `npx -y package` | Database | | | | researched | | |
|
|
77
|
+
| 40 | `owner/repo` | `docker run image` | Security | | | | researched | | |
|
|
78
|
+
| 41 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
79
|
+
| 42 | `owner/repo` | `uvx package` | Data | | | | researched | | |
|
|
80
|
+
| 43 | `owner/repo` | `npx -y package` | Search | | | | researched | | |
|
|
81
|
+
| 44 | `owner/repo` | `npx -y package` | SaaS | | | | researched | | |
|
|
82
|
+
| 45 | `owner/repo` | `docker run image` | Cloud | | | | researched | | |
|
|
83
|
+
| 46 | `owner/repo` | `npx -y package` | Filesystem | | | | researched | | |
|
|
84
|
+
| 47 | `owner/repo` | `uvx package` | Security | | | | researched | | |
|
|
85
|
+
| 48 | `owner/repo` | `npx -y package` | Developer Tools | | | | researched | | |
|
|
86
|
+
| 49 | `owner/repo` | `npx -y package` | Infrastructure | | | | researched | | |
|
|
87
|
+
| 50 | `owner/repo` | `docker run image` | Browser Automation | | | | researched | | |
|
|
88
|
+
|
|
89
|
+
Statuses:
|
|
90
|
+
|
|
91
|
+
- `researched`
|
|
92
|
+
- `branch-ready`
|
|
93
|
+
- `pr-opened`
|
|
94
|
+
- `accepted`
|
|
95
|
+
- `declined`
|
|
96
|
+
- `needs-maintainer-input`
|
|
97
|
+
- `proof-captured`
|
|
98
|
+
- `pilot-lead`
|
|
99
|
+
|
|
100
|
+
## PR Checklist
|
|
101
|
+
|
|
102
|
+
- Add `.github/workflows/mcp-observatory.yml`
|
|
103
|
+
- Use `deep: true` and `security: true`
|
|
104
|
+
- Keep `fail-on-regression: true` unless the repo is noisy
|
|
105
|
+
- Add README badge only when it fits the repo style
|
|
106
|
+
- Include the maintainer PR body from `certification-distribution.md`
|
|
107
|
+
- Do not include raw telemetry, private evidence, or sales pricing
|
|
108
|
+
|
|
109
|
+
## PR Templates
|
|
110
|
+
|
|
111
|
+
### Workflow-Only PR
|
|
112
|
+
|
|
113
|
+
```md
|
|
114
|
+
This adds a lightweight MCP Observatory check for this MCP server.
|
|
115
|
+
|
|
116
|
+
Why it helps:
|
|
117
|
+
|
|
118
|
+
- verifies MCP tools/prompts/resources still respond correctly
|
|
119
|
+
- catches schema drift and common security footguns before release
|
|
120
|
+
- posts a readable PR report for maintainers
|
|
121
|
+
- gives users a compatibility signal when evaluating MCP servers
|
|
122
|
+
|
|
123
|
+
It runs in GitHub Actions and does not require an account. If the check is too strict for this repo, `fail-on-regression: false` can be used while keeping the report visible.
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Workflow + Badge PR
|
|
127
|
+
|
|
128
|
+
```md
|
|
129
|
+
This adds MCP Observatory CI plus a small README badge so users can see this server is checked for MCP compatibility, schema drift, and common security issues.
|
|
130
|
+
|
|
131
|
+
The workflow runs on PRs and pushes to `main`. The badge links back to MCP Observatory for context and can be removed if it does not fit the repo style.
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Issue-Only Fallback
|
|
135
|
+
|
|
136
|
+
```md
|
|
137
|
+
I tried preparing a small MCP Observatory CI check for this server, but did not want to open a PR without confirming the safest startup command.
|
|
138
|
+
|
|
139
|
+
Would you accept a workflow that runs:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
npx @kryptosai/mcp-observatory test <server command> --security --deep
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The goal is to give users a visible compatibility/security signal and catch schema drift before releases.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Proof Capture
|
|
149
|
+
|
|
150
|
+
For accepted PRs, record:
|
|
151
|
+
|
|
152
|
+
- repo
|
|
153
|
+
- PR URL
|
|
154
|
+
- category
|
|
155
|
+
- accepted date
|
|
156
|
+
- badge added: yes/no
|
|
157
|
+
- CI status
|
|
158
|
+
- quote or maintainer reaction if public
|
|
159
|
+
- whether the repo appears in Glama, PulseMCP, Smithery, or awesome-MCP lists
|
|
160
|
+
|
|
161
|
+
Use accepted PRs as proof for:
|
|
162
|
+
|
|
163
|
+
- README traction section
|
|
164
|
+
- launch posts
|
|
165
|
+
- enterprise outreach
|
|
166
|
+
- directory listing copy
|
|
167
|
+
- weekly MCP safety report
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Certification Distribution Loop
|
|
2
|
+
|
|
3
|
+
Use this when opening helpful PRs to MCP server projects. The motion is simple: run MCP Observatory, give the maintainer a useful security/compatibility check, and leave them with a badge/report they can keep.
|
|
4
|
+
|
|
5
|
+
## Offer
|
|
6
|
+
|
|
7
|
+
MCP Observatory gives MCP server maintainers:
|
|
8
|
+
|
|
9
|
+
- CI coverage for tools, prompts, resources, schema quality, and security checks
|
|
10
|
+
- A PR comment report on every change
|
|
11
|
+
- A README badge they can show publicly
|
|
12
|
+
- A local-first OSS path with no account required
|
|
13
|
+
- A paid production path only if they need hosted history, private repo reporting, support, certification, or fleet visibility
|
|
14
|
+
|
|
15
|
+
## Copy-Paste Badge
|
|
16
|
+
|
|
17
|
+
For repos that add the GitHub Action, suggest this README badge:
|
|
18
|
+
|
|
19
|
+
```md
|
|
20
|
+
[](https://github.com/KryptosAI/mcp-observatory)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
For repos that generate a score badge, suggest:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npx @kryptosai/mcp-observatory badge npx -y <server-package> --output docs/mcp-health.svg
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```md
|
|
30
|
+
[](https://github.com/KryptosAI/mcp-observatory)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## GitHub Action Template
|
|
34
|
+
|
|
35
|
+
Fast path:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx @kryptosai/mcp-observatory init-ci --command "npx -y <server-package>" --badge
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
That creates:
|
|
42
|
+
|
|
43
|
+
- `.github/workflows/mcp-observatory.yml`
|
|
44
|
+
- `docs/mcp-observatory-badge.md`
|
|
45
|
+
|
|
46
|
+
Manual template:
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
name: MCP Observatory
|
|
50
|
+
|
|
51
|
+
on:
|
|
52
|
+
pull_request:
|
|
53
|
+
push:
|
|
54
|
+
branches: [main]
|
|
55
|
+
|
|
56
|
+
jobs:
|
|
57
|
+
mcp-observatory:
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
steps:
|
|
60
|
+
- uses: actions/checkout@v6
|
|
61
|
+
- uses: KryptosAI/mcp-observatory/action@main
|
|
62
|
+
with:
|
|
63
|
+
command: npx -y <server-package>
|
|
64
|
+
deep: true
|
|
65
|
+
security: true
|
|
66
|
+
comment-on-pr: true
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
For repos with a local target config:
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
- uses: KryptosAI/mcp-observatory/action@main
|
|
73
|
+
with:
|
|
74
|
+
target: ./observatory-target.json
|
|
75
|
+
deep: true
|
|
76
|
+
security: true
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Maintainer PR Body
|
|
80
|
+
|
|
81
|
+
```md
|
|
82
|
+
This adds a lightweight MCP Observatory check for this server.
|
|
83
|
+
|
|
84
|
+
Why it helps:
|
|
85
|
+
|
|
86
|
+
- verifies MCP tools/prompts/resources still respond correctly
|
|
87
|
+
- catches schema drift and common security footguns before release
|
|
88
|
+
- posts a readable PR report for maintainers
|
|
89
|
+
- creates a public compatibility signal for users evaluating MCP servers
|
|
90
|
+
|
|
91
|
+
It runs locally/inside GitHub Actions and does not require an account. If the check is too strict for this repo, `fail-on-regression: false` can be used while keeping the PR report visible.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Comment For Passing Repos
|
|
95
|
+
|
|
96
|
+
```md
|
|
97
|
+
Nice, this server passes MCP Observatory checks. If you want the signal in the README, you can add:
|
|
98
|
+
|
|
99
|
+
```md
|
|
100
|
+
[](https://github.com/KryptosAI/mcp-observatory)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
That gives users a quick compatibility/security signal when they are choosing MCP servers.
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Targeting Order
|
|
107
|
+
|
|
108
|
+
Prioritize repos with:
|
|
109
|
+
|
|
110
|
+
- 100+ GitHub stars or visible npm downloads
|
|
111
|
+
- active releases in the last 90 days
|
|
112
|
+
- MCP servers used by developer tools, security, CI/CD, databases, browser automation, or enterprise SaaS
|
|
113
|
+
- no existing MCP compatibility/security CI
|
|
114
|
+
- clear package command that can run in GitHub Actions
|
|
115
|
+
|
|
116
|
+
Avoid drive-by PRs where the server requires private credentials, paid services, or destructive default actions.
|
|
117
|
+
|
|
118
|
+
## Directory Follow-Through
|
|
119
|
+
|
|
120
|
+
After a repo accepts the check or badge:
|
|
121
|
+
|
|
122
|
+
- ask the maintainer to mention “tested with MCP Observatory” in their MCP directory listing
|
|
123
|
+
- update the MCP Observatory launch/story docs with the accepted repo
|
|
124
|
+
- use accepted PRs as proof in enterprise outreach
|
|
125
|
+
- invite production users to hosted reporting or certification pilots
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# MCP Server Compatibility
|
|
2
|
+
|
|
3
|
+
MCP Observatory supports two transport adapters — **local-process (stdio)** and **HTTP (Streamable HTTP + SSE)** — which together cover ~95% of the MCP server ecosystem.
|
|
4
|
+
|
|
5
|
+
This document tracks which servers work, how to configure them, and what patterns are not yet supported.
|
|
6
|
+
|
|
7
|
+
## Tested and Passing
|
|
8
|
+
|
|
9
|
+
These servers have been tested directly with MCP Observatory and produce valid results.
|
|
10
|
+
|
|
11
|
+
| Server | Package | Transport | Setup | Tools | Prompts | Resources |
|
|
12
|
+
|--------|---------|-----------|-------|-------|---------|-----------|
|
|
13
|
+
| Everything | [`@modelcontextprotocol/server-everything`](https://www.npmjs.com/package/@modelcontextprotocol/server-everything) | stdio | Zero-config | ✅ pass | ✅ pass | ✅ pass |
|
|
14
|
+
| Filesystem | [`@modelcontextprotocol/server-filesystem`](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem) | stdio | Path args | ✅ pass | — unsupported | — unsupported |
|
|
15
|
+
| Context7 | [`@upstash/context7-mcp`](https://www.npmjs.com/package/@upstash/context7-mcp) | stdio | Zero-config | ✅ pass | — unsupported | — unsupported |
|
|
16
|
+
| Puppeteer | [`puppeteer-mcp-server`](https://www.npmjs.com/package/puppeteer-mcp-server) | stdio | Zero-config | ✅ pass | — unsupported | ✅ pass |
|
|
17
|
+
| OpenTofu | [`@opentofu/opentofu-mcp-server`](https://www.npmjs.com/package/@opentofu/opentofu-mcp-server) | stdio | Zero-config | ✅ pass | — unsupported | ✅ pass |
|
|
18
|
+
| Ref Tools | [`ref-tools-mcp`](https://www.npmjs.com/package/ref-tools-mcp) | stdio | Zero-config | ✅ pass | ✅ pass | — unsupported |
|
|
19
|
+
| Promptopia | [`promptopia-mcp`](https://www.npmjs.com/package/promptopia-mcp) | stdio | Zero-config | ✅ pass | ✅ pass | — unsupported |
|
|
20
|
+
| GitHub MCP | Docker-based | stdio | `GITHUB_PERSONAL_ACCESS_TOKEN` | ✅ pass | ✅ pass | ✅ pass |
|
|
21
|
+
|
|
22
|
+
## Compatible (stdio, zero-config or env vars only)
|
|
23
|
+
|
|
24
|
+
These servers use standard stdio transport and should work with MCP Observatory. Most just need an API key as an env var.
|
|
25
|
+
|
|
26
|
+
### Zero-config (just `npx`)
|
|
27
|
+
|
|
28
|
+
| Server | Package | Command |
|
|
29
|
+
|--------|---------|---------|
|
|
30
|
+
| Sequential Thinking | [`@modelcontextprotocol/server-sequential-thinking`](https://www.npmjs.com/package/@modelcontextprotocol/server-sequential-thinking) | `npx -y @modelcontextprotocol/server-sequential-thinking` |
|
|
31
|
+
| Memory | [`@modelcontextprotocol/server-memory`](https://www.npmjs.com/package/@modelcontextprotocol/server-memory) | `npx -y @modelcontextprotocol/server-memory` |
|
|
32
|
+
| ESLint | [`@eslint/mcp`](https://www.npmjs.com/package/@eslint/mcp) | `npx -y @eslint/mcp` |
|
|
33
|
+
| SAP UI5 | [`@ui5/mcp-server`](https://www.npmjs.com/package/@ui5/mcp-server) | `npx -y @ui5/mcp-server` |
|
|
34
|
+
|
|
35
|
+
### API key via env var
|
|
36
|
+
|
|
37
|
+
| Server | Package | Env Var | Command |
|
|
38
|
+
|--------|---------|---------|---------|
|
|
39
|
+
| Brave Search | [`@modelcontextprotocol/server-brave-search`](https://www.npmjs.com/package/@modelcontextprotocol/server-brave-search) | `BRAVE_API_KEY` | `npx -y @modelcontextprotocol/server-brave-search` |
|
|
40
|
+
| Sentry | [`@sentry/mcp-server`](https://www.npmjs.com/package/@sentry/mcp-server) | `SENTRY_AUTH_TOKEN` | `npx -y @sentry/mcp-server` |
|
|
41
|
+
| Tavily | [`tavily-mcp`](https://www.npmjs.com/package/tavily-mcp) | `TAVILY_API_KEY` | `npx -y tavily-mcp` |
|
|
42
|
+
| Firecrawl | [`firecrawl-mcp`](https://www.npmjs.com/package/firecrawl-mcp) | `FIRECRAWL_API_KEY` | `npx -y firecrawl-mcp` |
|
|
43
|
+
| HubSpot | [`@hubspot/mcp-server`](https://www.npmjs.com/package/@hubspot/mcp-server) | API key | `npx -y @hubspot/mcp-server` |
|
|
44
|
+
| LaunchDarkly | [`@launchdarkly/mcp-server`](https://www.npmjs.com/package/@launchdarkly/mcp-server) | API key | `npx -y @launchdarkly/mcp-server` |
|
|
45
|
+
| Notion | [`@notionhq/notion-mcp-server`](https://www.npmjs.com/package/@notionhq/notion-mcp-server) | `OPENAPI_MCP_HEADERS` | `npx -y @notionhq/notion-mcp-server` |
|
|
46
|
+
| Stripe | [`@stripe/mcp`](https://www.npmjs.com/package/@stripe/mcp) | `--api-key` arg | `npx -y @stripe/mcp --api-key sk-...` |
|
|
47
|
+
|
|
48
|
+
Target config example with env vars:
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"targetId": "brave-search",
|
|
53
|
+
"adapter": "local-process",
|
|
54
|
+
"command": "npx",
|
|
55
|
+
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
|
|
56
|
+
"env": { "BRAVE_API_KEY": "your-key-here" },
|
|
57
|
+
"timeoutMs": 15000
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Positional args required
|
|
62
|
+
|
|
63
|
+
| Server | Package | Args | Command |
|
|
64
|
+
|--------|---------|------|---------|
|
|
65
|
+
| Filesystem | [`@modelcontextprotocol/server-filesystem`](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem) | Directory paths | `npx -y @modelcontextprotocol/server-filesystem /path/to/dir` |
|
|
66
|
+
| PostgreSQL | [`@modelcontextprotocol/server-postgres`](https://www.npmjs.com/package/@modelcontextprotocol/server-postgres) | Connection URL | `npx -y @modelcontextprotocol/server-postgres postgres://...` |
|
|
67
|
+
| SQLite | [`@modelcontextprotocol/server-sqlite`](https://www.npmjs.com/package/@modelcontextprotocol/server-sqlite) | `--db-path` | `npx -y @modelcontextprotocol/server-sqlite --db-path ./db.sqlite` |
|
|
68
|
+
| Redis | [`@modelcontextprotocol/server-redis`](https://www.npmjs.com/package/@modelcontextprotocol/server-redis) | Redis URL | `npx -y @modelcontextprotocol/server-redis redis://localhost:6379` |
|
|
69
|
+
| Git | [`mcp-server-git`](https://pypi.org/project/mcp-server-git/) | `--repository` | `uvx mcp-server-git --repository /path/to/repo` |
|
|
70
|
+
| Nx | [`nx-mcp`](https://www.npmjs.com/package/nx-mcp) | Workspace path | `npx -y nx-mcp --workspace /path` |
|
|
71
|
+
|
|
72
|
+
### Python servers (via `uvx`)
|
|
73
|
+
|
|
74
|
+
Python-based MCP servers work with the `local-process` adapter as long as `uv` is installed:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"targetId": "git-server",
|
|
79
|
+
"adapter": "local-process",
|
|
80
|
+
"command": "uvx",
|
|
81
|
+
"args": ["mcp-server-git", "--repository", "."],
|
|
82
|
+
"timeoutMs": 15000
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Compatible (HTTP/SSE remote)
|
|
87
|
+
|
|
88
|
+
These servers expose a hosted HTTP endpoint. Use the `http` adapter:
|
|
89
|
+
|
|
90
|
+
| Server | URL | Auth |
|
|
91
|
+
|--------|-----|------|
|
|
92
|
+
| Cloudflare | `https://observability.mcp.cloudflare.com/mcp` | API token via `authToken` |
|
|
93
|
+
| Exa | `https://mcp.exa.ai/mcp` | `EXA_API_KEY` via `authToken` |
|
|
94
|
+
| Tavily (remote) | `https://mcp.tavily.com/mcp` | Bearer token via `authToken` |
|
|
95
|
+
| Context7 (remote) | `https://mcp.context7.com/mcp` | Optional API key |
|
|
96
|
+
|
|
97
|
+
Target config example:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"targetId": "cloudflare",
|
|
102
|
+
"adapter": "http",
|
|
103
|
+
"url": "https://observability.mcp.cloudflare.com/mcp",
|
|
104
|
+
"authToken": "your-cloudflare-api-token",
|
|
105
|
+
"timeoutMs": 15000
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Compatible (Docker)
|
|
110
|
+
|
|
111
|
+
Many MCP servers ship Docker images. These work with the `local-process` adapter — Docker's `-i` flag attaches stdin/stdout, which is standard stdio transport.
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"targetId": "github-docker",
|
|
116
|
+
"adapter": "local-process",
|
|
117
|
+
"command": "docker",
|
|
118
|
+
"args": ["run", "-i", "--rm",
|
|
119
|
+
"-e", "GITHUB_PERSONAL_ACCESS_TOKEN=ghp_...",
|
|
120
|
+
"ghcr.io/github/github-mcp-server"],
|
|
121
|
+
"timeoutMs": 30000
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
mcp-observatory run -- docker run -i --rm ghcr.io/github/github-mcp-server
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
All official `@modelcontextprotocol/server-*` packages publish Docker images that work this way.
|
|
130
|
+
|
|
131
|
+
## Known Incompatible
|
|
132
|
+
|
|
133
|
+
These servers do not work with MCP Observatory due to transport or architecture constraints:
|
|
134
|
+
|
|
135
|
+
| Server | Why | Workaround |
|
|
136
|
+
|--------|-----|------------|
|
|
137
|
+
| BrowserTools MCP | Custom WebSocket transport between Chrome extension, middleware, and MCP server | None — non-standard transport |
|
|
138
|
+
| Google Drive | Requires interactive OAuth browser flow before first use | Pre-authenticate manually, then run Observatory |
|
|
139
|
+
| `@modelcontextprotocol/server-map` | Times out under stdio harness | May need specific startup args |
|
|
140
|
+
| `@modelcontextprotocol/server-threejs` | Closes connection before init | App-oriented, not a pure stdio server |
|
|
141
|
+
| `@modelcontextprotocol/server-pdf` | Times out under probe setup | May need specific startup args |
|
|
142
|
+
| `@jsonresume/mcp` | Closes connection before init | May expect different invocation |
|
|
143
|
+
|
|
144
|
+
## Transport Coverage
|
|
145
|
+
|
|
146
|
+
MCP Observatory covers both standard MCP transports:
|
|
147
|
+
|
|
148
|
+
| Transport | Adapter | Status |
|
|
149
|
+
|-----------|---------|--------|
|
|
150
|
+
| **stdio** (subprocess, JSON-RPC over stdin/stdout) | `local-process` | ✅ Supported |
|
|
151
|
+
| **Streamable HTTP** (POST to endpoint, SSE response) | `http` | ✅ Supported |
|
|
152
|
+
| **HTTP+SSE** (deprecated, separate GET/POST endpoints) | `http` (fallback) | ✅ Supported |
|
|
153
|
+
| WebSocket (non-standard) | — | ❌ Not supported |
|
|
154
|
+
|
|
155
|
+
Per the [MCP specification](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports), stdio and Streamable HTTP are the two standard transports. The deprecated HTTP+SSE transport is handled automatically via SDK fallback.
|
|
156
|
+
|
|
157
|
+
## Ecosystem Stats
|
|
158
|
+
|
|
159
|
+
Based on analysis of the top 30+ MCP servers by npm downloads:
|
|
160
|
+
|
|
161
|
+
- **~85%** use stdio as primary transport → covered by `local-process` adapter
|
|
162
|
+
- **~10%** are HTTP-only remote services → covered by `http` adapter
|
|
163
|
+
- **~5%** support both stdio and HTTP → both adapters work
|
|
164
|
+
- **<1%** use non-standard transports (WebSocket) → not supported
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Decisions
|
|
2
|
+
|
|
3
|
+
These decisions exist so the repo does not drift into vague feature accumulation.
|
|
4
|
+
|
|
5
|
+
## 2026-03-19: Semantics v1 stays intentionally narrow
|
|
6
|
+
|
|
7
|
+
`semantics` only checks advertised capability, callable endpoint response, and minimal expected shape. The first job of MCP Observatory is to explain drift, not to claim semantic correctness it does not yet earn.
|
|
8
|
+
|
|
9
|
+
## 2026-03-19: The project stays CLI-first
|
|
10
|
+
|
|
11
|
+
The durable product surface is the artifact plus the report. A dashboard can wait. Until the evidence surface is boringly trustworthy, adding hosted UX would mostly be theater.
|
|
12
|
+
|
|
13
|
+
## 2026-03-19: `unsupported` and `failed` remain separate
|
|
14
|
+
|
|
15
|
+
`unsupported` means the target did not advertise the capability. `failed` means the capability path or startup path should have worked and did not. Collapsing those states would hide useful ecosystem truth.
|
|
16
|
+
|
|
17
|
+
## 2026-03-19: installability is part of the credibility bar
|
|
18
|
+
|
|
19
|
+
The package stays scoped as `@kryptosai/mcp-observatory`, and the release flow should be able to publish it. Until npm credentials are configured, GitHub release tarballs are the honest fallback. The repo should never imply a one-command install path that does not actually work.
|
|
20
|
+
|
|
21
|
+
## 2026-03-19: Every release needs a reason to exist
|
|
22
|
+
|
|
23
|
+
Packaging-only churn is not a release story. Every release should include at least one real-server learning, one report-quality improvement, or one schema trust improvement.
|
package/docs/demo.svg
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="820" height="320" viewBox="0 0 820 320">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.bg { fill: #1e1e2e; }
|
|
5
|
+
.title-bar { fill: #313244; }
|
|
6
|
+
.dot-red { fill: #f38ba8; }
|
|
7
|
+
.dot-yellow { fill: #f9e2af; }
|
|
8
|
+
.dot-green { fill: #a6e3a1; }
|
|
9
|
+
.text { fill: #cdd6f4; font-family: 'Menlo', 'Monaco', 'Courier New', monospace; font-size: 13px; }
|
|
10
|
+
.bold { fill: #cdd6f4; font-weight: bold; }
|
|
11
|
+
.dim { fill: #6c7086; }
|
|
12
|
+
.green { fill: #a6e3a1; }
|
|
13
|
+
.yellow { fill: #f9e2af; }
|
|
14
|
+
.prompt { fill: #89b4fa; }
|
|
15
|
+
.line { stroke: #45475a; stroke-width: 1; }
|
|
16
|
+
</style>
|
|
17
|
+
</defs>
|
|
18
|
+
<rect class="bg" width="820" height="320" rx="10"/>
|
|
19
|
+
<rect class="title-bar" width="820" height="36" rx="10"/>
|
|
20
|
+
<rect class="title-bar" x="0" y="26" width="820" height="10"/>
|
|
21
|
+
<circle class="dot-red" cx="20" cy="18" r="6"/>
|
|
22
|
+
<circle class="dot-yellow" cx="40" cy="18" r="6"/>
|
|
23
|
+
<circle class="dot-green" cx="60" cy="18" r="6"/>
|
|
24
|
+
<text class="dim" x="350" y="22" text-anchor="middle">mcp-observatory — scan</text>
|
|
25
|
+
|
|
26
|
+
<text class="prompt" x="20" y="65">$</text>
|
|
27
|
+
<text class="text" x="35" y="65">npx @kryptosai/mcp-observatory scan --invoke-tools</text>
|
|
28
|
+
|
|
29
|
+
<text class="bold" x="20" y="100">Discovered 2 MCP server(s):</text>
|
|
30
|
+
<text class="dim" x="30" y="118">github (from ~/.claude.json)</text>
|
|
31
|
+
<text class="dim" x="30" y="136">filesystem (from ~/.claude.json)</text>
|
|
32
|
+
|
|
33
|
+
<text class="bold" x="20" y="170">Scan Results:</text>
|
|
34
|
+
|
|
35
|
+
<text class="bold" x="20" y="195">Target</text>
|
|
36
|
+
<text class="bold" x="230" y="195">Gate</text>
|
|
37
|
+
<text class="bold" x="300" y="195">Tools</text>
|
|
38
|
+
<text class="bold" x="400" y="195">Prompts</text>
|
|
39
|
+
<text class="bold" x="510" y="195">Resources</text>
|
|
40
|
+
<text class="bold" x="630" y="195">Invoke</text>
|
|
41
|
+
|
|
42
|
+
<line class="line" x1="20" y1="203" x2="750" y2="203"/>
|
|
43
|
+
|
|
44
|
+
<text class="text" x="20" y="225">github</text>
|
|
45
|
+
<text class="green" x="230" y="225">pass</text>
|
|
46
|
+
<text class="green" x="300" y="225">pass</text>
|
|
47
|
+
<text class="green" x="400" y="225">pass</text>
|
|
48
|
+
<text class="green" x="510" y="225">pass</text>
|
|
49
|
+
<text class="yellow" x="630" y="225">partial</text>
|
|
50
|
+
|
|
51
|
+
<text class="text" x="20" y="250">filesystem</text>
|
|
52
|
+
<text class="green" x="230" y="250">pass</text>
|
|
53
|
+
<text class="green" x="300" y="250">pass</text>
|
|
54
|
+
<text class="dim" x="400" y="250">unsupported</text>
|
|
55
|
+
<text class="dim" x="510" y="250">unsupported</text>
|
|
56
|
+
<text class="green" x="630" y="250">pass</text>
|
|
57
|
+
|
|
58
|
+
<text class="dim" x="20" y="295">Checked 2 servers in 3.2s</text>
|
|
59
|
+
</svg>
|