@kryptosai/mcp-observatory 0.20.3 → 0.22.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 +48 -1
- 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 +31 -0
- package/dist/src/commands/init-ci.js +238 -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/reporters/common.d.ts +16 -0
- package/dist/src/reporters/common.js +76 -0
- package/dist/src/reporters/common.js.map +1 -1
- package/dist/src/reporters/html.js +20 -0
- package/dist/src/reporters/html.js.map +1 -1
- package/dist/src/reporters/markdown.js +14 -2
- package/dist/src/reporters/markdown.js.map +1 -1
- package/dist/src/reporters/pr-comment.js +18 -1
- package/dist/src/reporters/pr-comment.js.map +1 -1
- package/dist/src/reporters/terminal.js +9 -1
- package/dist/src/reporters/terminal.js.map +1 -1
- 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 +181 -0
- package/docs/certification-distribution.md +129 -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 +77 -0
- package/package.json +33 -18
- package/schemas/diff-artifact.schema.json +62 -66
- package/schemas/run-artifact.schema.json +107 -142
package/dist/src/telemetry.js
CHANGED
|
@@ -11,6 +11,7 @@ const execFileAsync = promisify(execFile);
|
|
|
11
11
|
const CONFIG_DIR = path.join(os.homedir(), ".mcp-observatory");
|
|
12
12
|
const CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
|
|
13
13
|
const DEFAULT_ENDPOINT = "https://mcp-observatory-telemetry.kryptosai.workers.dev/v1/events";
|
|
14
|
+
const FIRST_PARTY_GITHUB_REPOSITORY = "kryptosai/mcp-observatory";
|
|
14
15
|
// ── Config cache ─────────────────────────────────────────────────────────────
|
|
15
16
|
let _cachedConfig = null;
|
|
16
17
|
export function configDir() {
|
|
@@ -71,9 +72,11 @@ export async function showFirstRunNotice() {
|
|
|
71
72
|
const notice = [
|
|
72
73
|
"",
|
|
73
74
|
" ┌─────────────────────────────────────────────────────────────┐",
|
|
74
|
-
" │ MCP Observatory collects
|
|
75
|
+
" │ MCP Observatory collects product usage telemetry. │",
|
|
75
76
|
" │ │",
|
|
76
|
-
" │
|
|
77
|
+
" │ It may include command names, server IDs/commands, CI │",
|
|
78
|
+
" │ info, git email/remote, hostname, and scan outcomes. │",
|
|
79
|
+
" │ Set MCP_OBSERVATORY_ORG / CONTACT for account reports. │",
|
|
77
80
|
" │ To opt out: mcp-observatory telemetry disable │",
|
|
78
81
|
" │ Or set: DO_NOT_TRACK=1 │",
|
|
79
82
|
" └─────────────────────────────────────────────────────────────┘",
|
|
@@ -134,6 +137,36 @@ export function detectCiProvider() {
|
|
|
134
137
|
return "azure-pipelines";
|
|
135
138
|
return undefined;
|
|
136
139
|
}
|
|
140
|
+
function envValue(name) {
|
|
141
|
+
const value = process.env[name]?.trim();
|
|
142
|
+
return value || undefined;
|
|
143
|
+
}
|
|
144
|
+
export function collectGitHubActionsMetadata() {
|
|
145
|
+
return {
|
|
146
|
+
githubRepository: envValue("GITHUB_REPOSITORY"),
|
|
147
|
+
githubWorkflow: envValue("GITHUB_WORKFLOW"),
|
|
148
|
+
githubRunId: envValue("GITHUB_RUN_ID"),
|
|
149
|
+
githubRunNumber: envValue("GITHUB_RUN_NUMBER"),
|
|
150
|
+
githubEventName: envValue("GITHUB_EVENT_NAME"),
|
|
151
|
+
githubRef: envValue("GITHUB_REF"),
|
|
152
|
+
githubActor: envValue("GITHUB_ACTOR"),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export function isFirstPartyGitHubRepository(repository) {
|
|
156
|
+
return repository?.trim().toLowerCase() === FIRST_PARTY_GITHUB_REPOSITORY;
|
|
157
|
+
}
|
|
158
|
+
export function classifyTelemetrySource(options) {
|
|
159
|
+
const isFirstParty = options.ciProvider === "github-actions" && isFirstPartyGitHubRepository(options.githubRepository);
|
|
160
|
+
if (isFirstParty)
|
|
161
|
+
return { isFirstParty, telemetrySource: "first_party_ci" };
|
|
162
|
+
if (options.isCI || options.ciProvider)
|
|
163
|
+
return { isFirstParty, telemetrySource: "external_ci" };
|
|
164
|
+
if (options.transport === "mcp")
|
|
165
|
+
return { isFirstParty, telemetrySource: "mcp" };
|
|
166
|
+
if (options.transport === "cli")
|
|
167
|
+
return { isFirstParty, telemetrySource: "local" };
|
|
168
|
+
return { isFirstParty, telemetrySource: "unknown" };
|
|
169
|
+
}
|
|
137
170
|
let _cachedIdentity = null;
|
|
138
171
|
let _identityPromise = null;
|
|
139
172
|
export function collectUserIdentity() {
|
|
@@ -143,6 +176,12 @@ export function collectUserIdentity() {
|
|
|
143
176
|
return _identityPromise;
|
|
144
177
|
_identityPromise = (async () => {
|
|
145
178
|
const identity = { hostname: os.hostname() };
|
|
179
|
+
const org = process.env["MCP_OBSERVATORY_ORG"]?.trim();
|
|
180
|
+
const contact = process.env["MCP_OBSERVATORY_CONTACT"]?.trim();
|
|
181
|
+
if (org)
|
|
182
|
+
identity.org = org;
|
|
183
|
+
if (contact)
|
|
184
|
+
identity.contact = contact;
|
|
146
185
|
try {
|
|
147
186
|
const { stdout } = await execFileAsync("git", ["config", "user.email"], { timeout: 2000 });
|
|
148
187
|
identity.gitEmail = stdout.trim() || undefined;
|
|
@@ -167,6 +206,15 @@ export function _resetIdentityCache() {
|
|
|
167
206
|
export function buildEvent(event, command, transport, enrichment) {
|
|
168
207
|
const ci = detectCI();
|
|
169
208
|
const identity = _cachedIdentity;
|
|
209
|
+
const ciProvider = enrichment?.ciProvider ?? detectCiProvider();
|
|
210
|
+
const github = ciProvider === "github-actions" ? collectGitHubActionsMetadata() : {};
|
|
211
|
+
const githubRepository = enrichment?.githubRepository ?? github.githubRepository;
|
|
212
|
+
const classification = classifyTelemetrySource({
|
|
213
|
+
transport,
|
|
214
|
+
isCI: ci.isCI,
|
|
215
|
+
ciProvider,
|
|
216
|
+
githubRepository,
|
|
217
|
+
});
|
|
170
218
|
return {
|
|
171
219
|
event,
|
|
172
220
|
version: TOOL_VERSION,
|
|
@@ -177,10 +225,16 @@ export function buildEvent(event, command, transport, enrichment) {
|
|
|
177
225
|
isCI: ci.isCI,
|
|
178
226
|
ciName: ci.ciName,
|
|
179
227
|
transport,
|
|
180
|
-
ciProvider
|
|
228
|
+
ciProvider,
|
|
229
|
+
org: enrichment?.org ?? identity?.org,
|
|
230
|
+
contact: enrichment?.contact ?? identity?.contact,
|
|
181
231
|
gitEmail: identity?.gitEmail,
|
|
182
232
|
gitRemoteUrl: identity?.gitRemoteUrl,
|
|
183
233
|
hostname: identity?.hostname,
|
|
234
|
+
...github,
|
|
235
|
+
githubRepository,
|
|
236
|
+
isFirstParty: enrichment?.isFirstParty ?? classification.isFirstParty,
|
|
237
|
+
telemetrySource: enrichment?.telemetrySource ?? classification.telemetrySource,
|
|
184
238
|
...enrichment,
|
|
185
239
|
};
|
|
186
240
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export interface LocalProcessTargetConfig {
|
|
|
13
13
|
env?: Record<string, string>;
|
|
14
14
|
timeoutMs?: number;
|
|
15
15
|
metadata?: Record<string, string>;
|
|
16
|
+
/** Suppress known security findings by rule id, tool name, or toolName:ruleId. */
|
|
17
|
+
securitySuppressions?: string[];
|
|
16
18
|
/** Skip tool invocation checks for this target even with `scan deep`. */
|
|
17
19
|
skipInvoke?: boolean;
|
|
18
20
|
}
|
|
@@ -24,6 +26,8 @@ export interface HttpTargetConfig {
|
|
|
24
26
|
headers?: Record<string, string>;
|
|
25
27
|
timeoutMs?: number;
|
|
26
28
|
metadata?: Record<string, string>;
|
|
29
|
+
/** Suppress known security findings by rule id, tool name, or toolName:ruleId. */
|
|
30
|
+
securitySuppressions?: string[];
|
|
27
31
|
/** Skip tool invocation checks for this target even with `scan deep`. */
|
|
28
32
|
skipInvoke?: boolean;
|
|
29
33
|
}
|
|
@@ -53,6 +57,7 @@ export interface EvidenceSummary {
|
|
|
53
57
|
diagnostics?: string[];
|
|
54
58
|
schemas?: Record<string, object>;
|
|
55
59
|
responseSnapshots?: Record<string, unknown>;
|
|
60
|
+
findings?: Array<Record<string, unknown>>;
|
|
56
61
|
}
|
|
57
62
|
export interface CheckResult {
|
|
58
63
|
id: CheckId;
|
package/dist/src/validate.js
CHANGED
|
@@ -15,6 +15,47 @@ function requireArray(obj, field, label) {
|
|
|
15
15
|
}
|
|
16
16
|
return value;
|
|
17
17
|
}
|
|
18
|
+
function expandEnvValue(value, label) {
|
|
19
|
+
const match = value.match(/^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/) ??
|
|
20
|
+
value.match(/^\$([A-Za-z_][A-Za-z0-9_]*)$/) ??
|
|
21
|
+
value.match(/^env:([A-Za-z_][A-Za-z0-9_]*)$/);
|
|
22
|
+
if (!match)
|
|
23
|
+
return value;
|
|
24
|
+
const name = match[1];
|
|
25
|
+
const envValue = process.env[name];
|
|
26
|
+
if (envValue === undefined) {
|
|
27
|
+
throw new Error(`${label} references missing environment variable '${name}'.`);
|
|
28
|
+
}
|
|
29
|
+
return envValue;
|
|
30
|
+
}
|
|
31
|
+
function optionalStringRecord(value, label, expand = false) {
|
|
32
|
+
if (value === undefined)
|
|
33
|
+
return undefined;
|
|
34
|
+
if (!isObject(value)) {
|
|
35
|
+
throw new Error(`${label} must be an object with string values.`);
|
|
36
|
+
}
|
|
37
|
+
const result = {};
|
|
38
|
+
for (const [key, raw] of Object.entries(value)) {
|
|
39
|
+
if (typeof raw !== "string") {
|
|
40
|
+
throw new Error(`${label}.${key} must be a string.`);
|
|
41
|
+
}
|
|
42
|
+
result[key] = expand ? expandEnvValue(raw, `${label}.${key}`) : raw;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
function optionalStringArray(value, label) {
|
|
47
|
+
if (value === undefined)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (!Array.isArray(value)) {
|
|
50
|
+
throw new Error(`${label} must be an array of strings.`);
|
|
51
|
+
}
|
|
52
|
+
return value.map((entry, i) => {
|
|
53
|
+
if (typeof entry !== "string" || entry.length === 0) {
|
|
54
|
+
throw new Error(`${label}[${i}] must be a non-empty string.`);
|
|
55
|
+
}
|
|
56
|
+
return entry;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
18
59
|
export function validateTargetConfig(data) {
|
|
19
60
|
if (!isObject(data)) {
|
|
20
61
|
throw new Error("Target config must be a JSON object.");
|
|
@@ -27,10 +68,11 @@ export function validateTargetConfig(data) {
|
|
|
27
68
|
targetId,
|
|
28
69
|
adapter: "http",
|
|
29
70
|
url,
|
|
30
|
-
authToken: typeof data["authToken"] === "string" ? data["authToken"] : undefined,
|
|
31
|
-
headers:
|
|
71
|
+
authToken: typeof data["authToken"] === "string" ? expandEnvValue(data["authToken"], "Target config authToken") : undefined,
|
|
72
|
+
headers: optionalStringRecord(data["headers"], "Target config headers", true),
|
|
32
73
|
timeoutMs: typeof data["timeoutMs"] === "number" ? data["timeoutMs"] : undefined,
|
|
33
|
-
metadata:
|
|
74
|
+
metadata: optionalStringRecord(data["metadata"], "Target config metadata"),
|
|
75
|
+
securitySuppressions: optionalStringArray(data["securitySuppressions"], "Target config securitySuppressions"),
|
|
34
76
|
skipInvoke: data["skipInvoke"] === true ? true : undefined,
|
|
35
77
|
};
|
|
36
78
|
}
|
|
@@ -51,9 +93,10 @@ export function validateTargetConfig(data) {
|
|
|
51
93
|
command,
|
|
52
94
|
args,
|
|
53
95
|
cwd: typeof data["cwd"] === "string" ? data["cwd"] : undefined,
|
|
54
|
-
env:
|
|
96
|
+
env: optionalStringRecord(data["env"], "Target config env", true),
|
|
55
97
|
timeoutMs: typeof data["timeoutMs"] === "number" ? data["timeoutMs"] : undefined,
|
|
56
|
-
metadata:
|
|
98
|
+
metadata: optionalStringRecord(data["metadata"], "Target config metadata"),
|
|
99
|
+
securitySuppressions: optionalStringArray(data["securitySuppressions"], "Target config securitySuppressions"),
|
|
57
100
|
skipInvoke: data["skipInvoke"] === true ? true : undefined,
|
|
58
101
|
};
|
|
59
102
|
}
|
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,181 @@
|
|
|
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 | `modelcontextprotocol/servers` | `npx -y @modelcontextprotocol/server-everything` | Reference | Official/reference signal | verify active package path | Safe reference target; PR may need package-specific scope | researched | | |
|
|
39
|
+
| 2 | `modelcontextprotocol/servers` | `npx -y @modelcontextprotocol/server-filesystem .` | Filesystem | Official/reference signal | verify package location | Needs harmless temp directory target | researched | | |
|
|
40
|
+
| 3 | `upstash/context7` | `npx -y @upstash/context7-mcp` | Developer Tools | Directory/listing signal | verify current package name | Network behavior should be reviewed before fail gate | researched | | |
|
|
41
|
+
| 4 | `executeautomation/mcp-playwright` | `npx -y @executeautomation/playwright-mcp-server` | Browser Automation | High-interest browser MCP category | verify current package name | Browser install may be slow; start workflow-only | researched | | |
|
|
42
|
+
| 5 | `browserbase/mcp-server-browserbase` | `npx -y @browserbasehq/mcp-server-browserbase` | Browser Automation | Hosted browser MCP category | verify auth-free startup | May require API key; issue-only if startup requires credentials | researched | | |
|
|
43
|
+
| 6 | `smithery-ai/server-sequential-thinking` | `npx -y @smithery-ai/server-sequential-thinking` | Developer Tools | MCP directory ecosystem | verify package/repo naming | Good low-risk simple server if public package starts cleanly | researched | | |
|
|
44
|
+
| 7 | `kazuph/mcp-taskmanager` | `npx -y mcp-taskmanager` | Developer Tools | Task/project MCP category | verify package | Confirm no destructive default actions | researched | | |
|
|
45
|
+
| 8 | `cyanheads/filesystem-mcp-server` | `npx -y filesystem-mcp-server .` | Filesystem | Popular category | verify command | Needs harmless temp directory target | researched | | |
|
|
46
|
+
| 9 | `redis/mcp-redis` | `uvx mcp-redis` | Database | Enterprise database category | verify auth-free startup | Database target may require service; issue-only if credentials needed | researched | | |
|
|
47
|
+
| 10 | `mongodb-js/mongodb-mcp-server` | `npx -y mongodb-mcp-server` | Database | Enterprise database category | verify auth-free startup | Likely needs connection string; issue-only first | researched | | |
|
|
48
|
+
| 11 | `supabase-community/supabase-mcp` | `npx -y supabase-mcp` | Database | Enterprise/SaaS category | verify current package | Likely requires token; issue-only first | researched | | |
|
|
49
|
+
| 12 | `cloudflare/mcp-server-cloudflare` | `npx -y @cloudflare/mcp-server-cloudflare` | Cloud | Enterprise cloud category | verify package | Likely requires auth; issue-only first | researched | | |
|
|
50
|
+
| 13 | `stripe/agent-toolkit` | `npx -y @stripe/agent-toolkit` | Payments | Enterprise payments category | verify MCP mode | Likely requires API key; issue-only first | researched | | |
|
|
51
|
+
| 14 | `github/github-mcp-server` | `docker run ghcr.io/github/github-mcp-server` | Developer Tools | Major platform category | verify image/startup | Auth required for useful checks; issue-only first | researched | | |
|
|
52
|
+
| 15 | `microsoft/playwright-mcp` | `npx -y @playwright/mcp` | Browser Automation | Major platform category | verify package | Browser dependencies may be slow; workflow-only first | researched | | |
|
|
53
|
+
| 16 | `jetbrains/mcpProxy` | `npx -y @jetbrains/mcp-proxy` | Developer Tools | IDE platform category | verify package | May depend on IDE process; issue-only first | researched | | |
|
|
54
|
+
| 17 | `pydantic/pydantic-ai` | `uvx pydantic-ai-mcp` | AI Framework | Framework ecosystem | verify MCP server package | May be docs/example rather than standalone server | researched | | |
|
|
55
|
+
| 18 | `langchain-ai/langchain-mcp-adapters` | `npx -y <example-server>` | AI Framework | Framework ecosystem | choose example server | Adapter repo may not expose standalone server | researched | | |
|
|
56
|
+
| 19 | `apify/actors-mcp-server` | `npx -y @apify/actors-mcp-server` | SaaS/API | Automation platform category | verify auth-free startup | Likely requires token; issue-only first | researched | | |
|
|
57
|
+
| 20 | `notionhq/notion-mcp-server` | `npx -y @notionhq/notion-mcp-server` | SaaS/API | Major SaaS category | verify package | Likely requires token; issue-only first | researched | | |
|
|
58
|
+
| 21 | `linear/linear-mcp` | `npx -y @linear/mcp-server` | SaaS/API | Developer SaaS category | verify package | Likely requires token; issue-only first | researched | | |
|
|
59
|
+
| 22 | `sentry/sentry-mcp` | `npx -y @sentry/mcp-server` | Observability | Developer SaaS category | verify package | Likely requires token; issue-only first | researched | | |
|
|
60
|
+
| 23 | `elastic/mcp-server-elasticsearch` | `npx -y @elastic/mcp-server-elasticsearch` | Search | Enterprise search category | verify package | Likely requires service; issue-only first | researched | | |
|
|
61
|
+
| 24 | `qdrant/mcp-server-qdrant` | `uvx mcp-server-qdrant` | Vector Database | AI infra category | verify package | May require service URL; issue-only first | researched | | |
|
|
62
|
+
| 25 | `weaviate/mcp-server-weaviate` | `uvx mcp-server-weaviate` | Vector Database | AI infra category | verify package | May require service URL; issue-only first | 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
|
+
- Generate the local kit first:
|
|
103
|
+
`npx @kryptosai/mcp-observatory init-ci --all --command "<safe startup command>"`
|
|
104
|
+
- Add `.github/workflows/mcp-observatory.yml`
|
|
105
|
+
- Add `mcp-observatory.target.json` when the startup command needs args, cwd, or env placeholders
|
|
106
|
+
- Use `deep: true` and `security: true`
|
|
107
|
+
- Keep `fail-on-regression: true` unless the repo is noisy
|
|
108
|
+
- Add README badge only when it fits the repo style
|
|
109
|
+
- Include the generated maintainer PR body from `docs/mcp-observatory-pr-body.md`
|
|
110
|
+
- Do not include raw telemetry, private evidence, or sales pricing
|
|
111
|
+
- Prefer issue-only fallback when the server requires credentials, paid services, destructive tools, or unclear startup
|
|
112
|
+
|
|
113
|
+
## PR Templates
|
|
114
|
+
|
|
115
|
+
### Workflow-Only PR
|
|
116
|
+
|
|
117
|
+
```md
|
|
118
|
+
This adds a lightweight MCP Observatory check for this MCP server.
|
|
119
|
+
|
|
120
|
+
Why it helps:
|
|
121
|
+
|
|
122
|
+
- verifies MCP tools/prompts/resources still respond correctly
|
|
123
|
+
- catches schema drift and common security footguns before release
|
|
124
|
+
- posts a readable PR report for maintainers
|
|
125
|
+
- gives users a compatibility signal when evaluating MCP servers
|
|
126
|
+
|
|
127
|
+
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.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Workflow + Badge PR
|
|
131
|
+
|
|
132
|
+
```md
|
|
133
|
+
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.
|
|
134
|
+
|
|
135
|
+
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.
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Issue-Only Fallback
|
|
139
|
+
|
|
140
|
+
~~~md
|
|
141
|
+
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.
|
|
142
|
+
|
|
143
|
+
Would you accept a workflow that runs:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
npx @kryptosai/mcp-observatory test <server command> --security --deep
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
The goal is to give users a visible compatibility/security signal and catch schema drift before releases.
|
|
150
|
+
~~~
|
|
151
|
+
|
|
152
|
+
## Generated PR Body Printer
|
|
153
|
+
|
|
154
|
+
After running `init-ci --all`, print the generated maintainer copy with:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npm run certification:pr-body -- docs/mcp-observatory-pr-body.md
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
For a repo-specific body, run the command from the target branch after generating the local adoption kit.
|
|
161
|
+
|
|
162
|
+
## Proof Capture
|
|
163
|
+
|
|
164
|
+
For accepted PRs, record:
|
|
165
|
+
|
|
166
|
+
- repo
|
|
167
|
+
- PR URL
|
|
168
|
+
- category
|
|
169
|
+
- accepted date
|
|
170
|
+
- badge added: yes/no
|
|
171
|
+
- CI status
|
|
172
|
+
- quote or maintainer reaction if public
|
|
173
|
+
- whether the repo appears in Glama, PulseMCP, Smithery, or awesome-MCP lists
|
|
174
|
+
|
|
175
|
+
Use accepted PRs as proof for:
|
|
176
|
+
|
|
177
|
+
- README traction section
|
|
178
|
+
- launch posts
|
|
179
|
+
- enterprise outreach
|
|
180
|
+
- directory listing copy
|
|
181
|
+
- weekly MCP safety report
|
|
@@ -0,0 +1,129 @@
|
|
|
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 --all --command "npx -y <server-package>"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
That creates:
|
|
42
|
+
|
|
43
|
+
- `.github/workflows/mcp-observatory.yml`
|
|
44
|
+
- `docs/mcp-observatory-badge.md`
|
|
45
|
+
- `mcp-observatory.target.json`
|
|
46
|
+
- `docs/mcp-observatory-pr-body.md`
|
|
47
|
+
- `docs/mcp-observatory-issue.md`
|
|
48
|
+
- `docs/mcp-observatory-score-badge.md`
|
|
49
|
+
|
|
50
|
+
Manual template:
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
name: MCP Observatory
|
|
54
|
+
|
|
55
|
+
on:
|
|
56
|
+
pull_request:
|
|
57
|
+
push:
|
|
58
|
+
branches: [main]
|
|
59
|
+
|
|
60
|
+
jobs:
|
|
61
|
+
mcp-observatory:
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
steps:
|
|
64
|
+
- uses: actions/checkout@v6
|
|
65
|
+
- uses: KryptosAI/mcp-observatory/action@main
|
|
66
|
+
with:
|
|
67
|
+
command: npx -y <server-package>
|
|
68
|
+
deep: true
|
|
69
|
+
security: true
|
|
70
|
+
comment-on-pr: true
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
For repos with a local target config:
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
- uses: KryptosAI/mcp-observatory/action@main
|
|
77
|
+
with:
|
|
78
|
+
target: ./observatory-target.json
|
|
79
|
+
deep: true
|
|
80
|
+
security: true
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Maintainer PR Body
|
|
84
|
+
|
|
85
|
+
```md
|
|
86
|
+
This adds a lightweight MCP Observatory check for this server.
|
|
87
|
+
|
|
88
|
+
Why it helps:
|
|
89
|
+
|
|
90
|
+
- verifies MCP tools/prompts/resources still respond correctly
|
|
91
|
+
- catches schema drift and common security footguns before release
|
|
92
|
+
- posts a readable PR report for maintainers
|
|
93
|
+
- creates a public compatibility signal for users evaluating MCP servers
|
|
94
|
+
|
|
95
|
+
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.
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Comment For Passing Repos
|
|
99
|
+
|
|
100
|
+
```md
|
|
101
|
+
Nice, this server passes MCP Observatory checks. If you want the signal in the README, you can add:
|
|
102
|
+
|
|
103
|
+
```md
|
|
104
|
+
[](https://github.com/KryptosAI/mcp-observatory)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
That gives users a quick compatibility/security signal when they are choosing MCP servers.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Targeting Order
|
|
111
|
+
|
|
112
|
+
Prioritize repos with:
|
|
113
|
+
|
|
114
|
+
- 100+ GitHub stars or visible npm downloads
|
|
115
|
+
- active releases in the last 90 days
|
|
116
|
+
- MCP servers used by developer tools, security, CI/CD, databases, browser automation, or enterprise SaaS
|
|
117
|
+
- no existing MCP compatibility/security CI
|
|
118
|
+
- clear package command that can run in GitHub Actions
|
|
119
|
+
|
|
120
|
+
Avoid drive-by PRs where the server requires private credentials, paid services, or destructive default actions.
|
|
121
|
+
|
|
122
|
+
## Directory Follow-Through
|
|
123
|
+
|
|
124
|
+
After a repo accepts the check or badge:
|
|
125
|
+
|
|
126
|
+
- ask the maintainer to mention “tested with MCP Observatory” in their MCP directory listing
|
|
127
|
+
- update the MCP Observatory launch/story docs with the accepted repo
|
|
128
|
+
- use accepted PRs as proof in enterprise outreach
|
|
129
|
+
- invite production users to hosted reporting or certification pilots
|