@kryptosai/mcp-observatory 0.26.0 → 0.27.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 +7 -8
- package/PRIVACY.md +5 -5
- package/README.md +38 -24
- package/TERMS.md +1 -1
- package/dist/src/checks/schema-quality.js +1 -0
- package/dist/src/checks/schema-quality.js.map +1 -1
- package/dist/src/commands/enterprise-report.js +1 -1
- 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 +2 -0
- package/dist/src/commands/init-ci.js +51 -10
- package/dist/src/commands/init-ci.js.map +1 -1
- package/dist/src/commands/legacy.js +18 -2
- package/dist/src/commands/legacy.js.map +1 -1
- package/dist/src/commands/scan.js +30 -9
- package/dist/src/commands/scan.js.map +1 -1
- package/dist/src/commands/setup-ci-conversion.d.ts +25 -0
- package/dist/src/commands/setup-ci-conversion.js +119 -0
- package/dist/src/commands/setup-ci-conversion.js.map +1 -0
- package/dist/src/commands/test.js +50 -3
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/findings.d.ts +20 -0
- package/dist/src/findings.js +232 -0
- package/dist/src/findings.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.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/storage.d.ts +1 -0
- package/dist/src/storage.js +25 -0
- package/dist/src/storage.js.map +1 -1
- package/dist/src/telemetry.d.ts +3 -0
- package/dist/src/telemetry.js.map +1 -1
- package/docs/agent-runtime-quickstart.md +98 -0
- package/docs/code-scanning-launch-outreach.md +55 -0
- package/docs/feishu-lark-mcp.md +3 -3
- package/docs/github-code-scanning-for-mcp.md +94 -0
- package/docs/metrics-dashboard.md +2 -2
- package/docs/openclaw-agent-template/SOUL.md +156 -0
- package/docs/proof.md +4 -4
- package/docs/target-contribution-guide.md +139 -0
- package/docs/target-registry.md +116 -0
- package/package.json +33 -8
- 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,232 @@
|
|
|
1
|
+
const SECURITY_CONTROL_REFS = {
|
|
2
|
+
"shell-injection": ["mcp-observatory:tool-safety", "mcp-observatory:command-execution"],
|
|
3
|
+
"broad-filesystem": ["mcp-observatory:tool-safety", "mcp-observatory:filesystem-access"],
|
|
4
|
+
"permissive-schema": ["mcp-observatory:schema-quality", "mcp-observatory:least-privilege"],
|
|
5
|
+
"credential-pattern": ["mcp-observatory:data-exposure", "mcp-observatory:secret-handling"],
|
|
6
|
+
"no-auth-http": ["mcp-observatory:transport-security", "mcp-observatory:authentication"],
|
|
7
|
+
};
|
|
8
|
+
const SECURITY_RECOMMENDATIONS = {
|
|
9
|
+
"shell-injection": "Constrain command execution tools with strict allowlists, typed inputs, and clear destructive annotations.",
|
|
10
|
+
"broad-filesystem": "Narrow filesystem scope, prefer read-only access, and document destructive behavior explicitly.",
|
|
11
|
+
"permissive-schema": "Use a strict input schema and avoid accepting arbitrary properties for destructive tools.",
|
|
12
|
+
"credential-pattern": "Redact secrets from tool responses and move credentials into environment or secret storage.",
|
|
13
|
+
"no-auth-http": "Require authentication for HTTP MCP targets before exposing them to shared networks.",
|
|
14
|
+
};
|
|
15
|
+
function stableHash(value) {
|
|
16
|
+
let hash = 0x811c9dc5;
|
|
17
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
18
|
+
hash ^= value.charCodeAt(i);
|
|
19
|
+
hash = Math.imul(hash, 0x01000193);
|
|
20
|
+
}
|
|
21
|
+
return (hash >>> 0).toString(16).padStart(8, "0");
|
|
22
|
+
}
|
|
23
|
+
function toText(value) {
|
|
24
|
+
return typeof value === "string" && value.trim().length > 0 ? value : undefined;
|
|
25
|
+
}
|
|
26
|
+
function severityFromStatus(status) {
|
|
27
|
+
if (status === "fail")
|
|
28
|
+
return "high";
|
|
29
|
+
if (status === "partial" || status === "flaky")
|
|
30
|
+
return "medium";
|
|
31
|
+
return "info";
|
|
32
|
+
}
|
|
33
|
+
function normalizeSecuritySeverity(value, fallback) {
|
|
34
|
+
if (value === "high" || value === "medium" || value === "low")
|
|
35
|
+
return value;
|
|
36
|
+
return severityFromStatus(fallback);
|
|
37
|
+
}
|
|
38
|
+
function normalizeQualitySeverity(value) {
|
|
39
|
+
return value === "warning" ? "medium" : "info";
|
|
40
|
+
}
|
|
41
|
+
function findingId(parts) {
|
|
42
|
+
const input = [
|
|
43
|
+
parts.targetId,
|
|
44
|
+
parts.checkId,
|
|
45
|
+
parts.ruleId,
|
|
46
|
+
parts.subjectName ?? "",
|
|
47
|
+
parts.message,
|
|
48
|
+
String(parts.index),
|
|
49
|
+
].join("\n");
|
|
50
|
+
return `mcp-observatory/${parts.checkId}/${parts.ruleId}/${stableHash(input)}`;
|
|
51
|
+
}
|
|
52
|
+
function stripDiagnosticSeverity(diagnostic) {
|
|
53
|
+
if (!diagnostic.startsWith("["))
|
|
54
|
+
return { message: diagnostic };
|
|
55
|
+
const end = diagnostic.indexOf("]");
|
|
56
|
+
if (end <= 1 || end > 16)
|
|
57
|
+
return { message: diagnostic };
|
|
58
|
+
const raw = diagnostic.slice(1, end).toLowerCase();
|
|
59
|
+
if (!["high", "medium", "low", "warning", "info", "error", "note"].includes(raw)) {
|
|
60
|
+
return { message: diagnostic };
|
|
61
|
+
}
|
|
62
|
+
const message = diagnostic.slice(end + 1).trimStart();
|
|
63
|
+
if (!message)
|
|
64
|
+
return { message: diagnostic };
|
|
65
|
+
const severity = raw === "high" || raw === "error" ? "high"
|
|
66
|
+
: raw === "medium" || raw === "warning" ? "medium"
|
|
67
|
+
: raw === "low" ? "low"
|
|
68
|
+
: "info";
|
|
69
|
+
return { severity, message };
|
|
70
|
+
}
|
|
71
|
+
function securityFindingFromRecord(artifact, check, record, index) {
|
|
72
|
+
const ruleName = toText(record["ruleId"]) ?? "security";
|
|
73
|
+
const message = toText(record["message"]);
|
|
74
|
+
if (!message)
|
|
75
|
+
return undefined;
|
|
76
|
+
const toolName = toText(record["toolName"]) ?? artifact.target.targetId;
|
|
77
|
+
return {
|
|
78
|
+
id: findingId({
|
|
79
|
+
targetId: artifact.target.targetId,
|
|
80
|
+
checkId: check.id,
|
|
81
|
+
ruleId: ruleName,
|
|
82
|
+
subjectName: toolName,
|
|
83
|
+
message,
|
|
84
|
+
index,
|
|
85
|
+
}),
|
|
86
|
+
ruleId: `mcp-observatory/security/${ruleName}`,
|
|
87
|
+
title: `Security: ${ruleName}`,
|
|
88
|
+
message,
|
|
89
|
+
severity: normalizeSecuritySeverity(record["severity"], check.status),
|
|
90
|
+
category: "security",
|
|
91
|
+
checkId: check.id,
|
|
92
|
+
subject: {
|
|
93
|
+
type: toolName === "(target)" ? "target" : "tool",
|
|
94
|
+
name: toolName === "(target)" ? artifact.target.targetId : toolName,
|
|
95
|
+
},
|
|
96
|
+
recommendation: SECURITY_RECOMMENDATIONS[ruleName],
|
|
97
|
+
controlRefs: SECURITY_CONTROL_REFS[ruleName] ?? ["mcp-observatory:security"],
|
|
98
|
+
evidence: record,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function qualityFindingFromRecord(artifact, check, record, index) {
|
|
102
|
+
const itemType = toText(record["itemType"]);
|
|
103
|
+
const itemName = toText(record["itemName"]) ?? artifact.target.targetId;
|
|
104
|
+
const issue = toText(record["issue"]);
|
|
105
|
+
if (!itemType || !issue)
|
|
106
|
+
return undefined;
|
|
107
|
+
const normalizedItemType = itemType === "tool" || itemType === "prompt" || itemType === "resource"
|
|
108
|
+
? itemType
|
|
109
|
+
: "check";
|
|
110
|
+
const ruleName = `schema-${issue.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "quality"}`;
|
|
111
|
+
const message = `${itemType} "${itemName}": ${issue}`;
|
|
112
|
+
return {
|
|
113
|
+
id: findingId({
|
|
114
|
+
targetId: artifact.target.targetId,
|
|
115
|
+
checkId: check.id,
|
|
116
|
+
ruleId: ruleName,
|
|
117
|
+
subjectName: itemName,
|
|
118
|
+
message,
|
|
119
|
+
index,
|
|
120
|
+
}),
|
|
121
|
+
ruleId: `mcp-observatory/schema-quality/${ruleName}`,
|
|
122
|
+
title: `Schema quality: ${issue}`,
|
|
123
|
+
message,
|
|
124
|
+
severity: normalizeQualitySeverity(record["severity"]),
|
|
125
|
+
category: "schema-quality",
|
|
126
|
+
checkId: check.id,
|
|
127
|
+
subject: { type: normalizedItemType, name: itemName },
|
|
128
|
+
recommendation: "Add clear names, descriptions, and strict JSON schema metadata so agents can call the MCP server safely.",
|
|
129
|
+
controlRefs: ["mcp-observatory:schema-quality", "mcp-observatory:agent-readiness"],
|
|
130
|
+
evidence: record,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function diagnosticFindings(artifact, check, diagnostics) {
|
|
134
|
+
return diagnostics.map((diagnostic, index) => {
|
|
135
|
+
const parsed = stripDiagnosticSeverity(diagnostic);
|
|
136
|
+
const ruleName = check.id === "schema-quality" ? "schema-diagnostic"
|
|
137
|
+
: check.id === "security" || check.id === "security-lite" ? "security-diagnostic"
|
|
138
|
+
: "diagnostic";
|
|
139
|
+
return {
|
|
140
|
+
id: findingId({
|
|
141
|
+
targetId: artifact.target.targetId,
|
|
142
|
+
checkId: check.id,
|
|
143
|
+
ruleId: ruleName,
|
|
144
|
+
message: parsed.message,
|
|
145
|
+
index,
|
|
146
|
+
}),
|
|
147
|
+
ruleId: `mcp-observatory/${check.id}/${ruleName}`,
|
|
148
|
+
title: `${check.id}: diagnostic`,
|
|
149
|
+
message: parsed.message,
|
|
150
|
+
severity: parsed.severity ?? severityFromStatus(check.status),
|
|
151
|
+
category: check.id,
|
|
152
|
+
checkId: check.id,
|
|
153
|
+
subject: { type: "check", name: check.id },
|
|
154
|
+
recommendation: "Review the check output and update the MCP server or target configuration before release.",
|
|
155
|
+
controlRefs: [`mcp-observatory:${check.id}`],
|
|
156
|
+
evidence: { diagnostic },
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function genericCheckFinding(artifact, check) {
|
|
161
|
+
const ruleName = `${check.id}-${check.status}`;
|
|
162
|
+
return {
|
|
163
|
+
id: findingId({
|
|
164
|
+
targetId: artifact.target.targetId,
|
|
165
|
+
checkId: check.id,
|
|
166
|
+
ruleId: ruleName,
|
|
167
|
+
message: check.message,
|
|
168
|
+
index: 0,
|
|
169
|
+
}),
|
|
170
|
+
ruleId: `mcp-observatory/${check.id}/${check.status}`,
|
|
171
|
+
title: `${check.id}: ${check.status}`,
|
|
172
|
+
message: check.message,
|
|
173
|
+
severity: severityFromStatus(check.status),
|
|
174
|
+
category: check.id,
|
|
175
|
+
checkId: check.id,
|
|
176
|
+
subject: { type: "check", name: check.id },
|
|
177
|
+
recommendation: "Fix the failing MCP Observatory check or document why this release should proceed.",
|
|
178
|
+
controlRefs: [`mcp-observatory:${check.id}`],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export function extractObservatoryFindings(artifact) {
|
|
182
|
+
const findings = [];
|
|
183
|
+
for (const check of artifact.checks) {
|
|
184
|
+
let addedStructured = false;
|
|
185
|
+
for (const evidence of check.evidence) {
|
|
186
|
+
const records = evidence.findings ?? [];
|
|
187
|
+
for (const [index, record] of records.entries()) {
|
|
188
|
+
const finding = check.id === "security" || check.id === "security-lite"
|
|
189
|
+
? securityFindingFromRecord(artifact, check, record, index)
|
|
190
|
+
: check.id === "schema-quality"
|
|
191
|
+
? qualityFindingFromRecord(artifact, check, record, index)
|
|
192
|
+
: undefined;
|
|
193
|
+
if (finding) {
|
|
194
|
+
findings.push(finding);
|
|
195
|
+
addedStructured = true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (!addedStructured) {
|
|
200
|
+
const diagnostics = check.evidence.flatMap((evidence) => evidence.diagnostics ?? []);
|
|
201
|
+
if (diagnostics.length > 0) {
|
|
202
|
+
findings.push(...diagnosticFindings(artifact, check, diagnostics));
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (!addedStructured && check.status !== "pass" && check.status !== "skipped" && check.status !== "unsupported") {
|
|
207
|
+
findings.push(genericCheckFinding(artifact, check));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (artifact.fatalError) {
|
|
211
|
+
findings.push({
|
|
212
|
+
id: findingId({
|
|
213
|
+
targetId: artifact.target.targetId,
|
|
214
|
+
checkId: "conformance",
|
|
215
|
+
ruleId: "fatal-error",
|
|
216
|
+
message: artifact.fatalError,
|
|
217
|
+
index: 0,
|
|
218
|
+
}),
|
|
219
|
+
ruleId: "mcp-observatory/run/fatal-error",
|
|
220
|
+
title: "Run failed before MCP checks completed",
|
|
221
|
+
message: artifact.fatalError.split("\n")[0] ?? "Run failed before MCP checks completed.",
|
|
222
|
+
severity: "high",
|
|
223
|
+
category: "runtime",
|
|
224
|
+
checkId: "conformance",
|
|
225
|
+
subject: { type: "target", name: artifact.target.targetId },
|
|
226
|
+
recommendation: "Fix the startup or transport failure before relying on this MCP server in CI.",
|
|
227
|
+
controlRefs: ["mcp-observatory:runtime-readiness"],
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return findings;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/findings.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export { renderMatrixComment, type MatrixRow } from "./reporters/pr-comment-matr
|
|
|
16
16
|
export { buildStatusDescription, buildCommitStatusContext } from "./commit-status.js";
|
|
17
17
|
export { buildCiReport } from "./commands/ci-report.js";
|
|
18
18
|
export { findExistingIssue, createOrUpdateIssue } from "./ci-issue.js";
|
|
19
|
+
export { extractObservatoryFindings, type ObservatoryFinding, type ObservatoryFindingSeverity } from "./findings.js";
|
|
19
20
|
export { renderSarif } from "./reporters/sarif.js";
|
|
20
21
|
export { renderTerminal, renderWatchFirstRun, renderWatchNoChanges, renderWatchChanges } from "./reporters/terminal.js";
|
|
21
22
|
export { runTarget, runTargetRecording, type RunOptions, type RunResult } from "./runner.js";
|
package/dist/src/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export { renderMatrixComment } from "./reporters/pr-comment-matrix.js";
|
|
|
16
16
|
export { buildStatusDescription, buildCommitStatusContext } from "./commit-status.js";
|
|
17
17
|
export { buildCiReport } from "./commands/ci-report.js";
|
|
18
18
|
export { findExistingIssue, createOrUpdateIssue } from "./ci-issue.js";
|
|
19
|
+
export { extractObservatoryFindings } from "./findings.js";
|
|
19
20
|
export { renderSarif } from "./reporters/sarif.js";
|
|
20
21
|
export { renderTerminal, renderWatchFirstRun, renderWatchNoChanges, renderWatchChanges } from "./reporters/terminal.js";
|
|
21
22
|
export { runTarget, runTargetRecording } from "./runner.js";
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,yBAAyB,EACzB,YAAY,EACZ,YAAY,GAGb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,cAAc,EAA0D,MAAM,4BAA4B,CAAC;AACpH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,mBAAmB,EAAkB,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxH,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAmC,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAqB,eAAe,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAqB,MAAM,aAAa,CAAC;AAClE,OAAO,EACL,kBAAkB,GAInB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAuB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,GAMvB,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,YAAY,CAAC;AACjE,OAAO,EACL,yBAAyB,EACzB,YAAY,EACZ,YAAY,GAGb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,cAAc,EAA0D,MAAM,4BAA4B,CAAC;AACpH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,mBAAmB,EAAkB,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAA4D,MAAM,eAAe,CAAC;AACrH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxH,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAmC,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAqB,eAAe,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAqB,MAAM,aAAa,CAAC;AAClE,OAAO,EACL,kBAAkB,GAInB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAuB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,GAMvB,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import type { RunArtifact } from "../types.js";
|
|
2
|
-
export
|
|
2
|
+
export interface RenderSarifOptions {
|
|
3
|
+
artifactUri?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function renderSarif(artifact: RunArtifact, options?: RenderSarifOptions): string;
|
|
@@ -1,48 +1,66 @@
|
|
|
1
|
+
import { extractObservatoryFindings } from "../findings.js";
|
|
1
2
|
import { TOOL_VERSION } from "../version.js";
|
|
2
|
-
function
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
function levelFromSeverity(severity) {
|
|
4
|
+
if (severity === "high")
|
|
5
|
+
return "error";
|
|
6
|
+
if (severity === "medium")
|
|
7
|
+
return "warning";
|
|
8
|
+
return "note";
|
|
9
|
+
}
|
|
10
|
+
function defaultArtifactUri(artifact) {
|
|
11
|
+
return `.mcp-observatory/runs/${artifact.runId}.json`;
|
|
12
|
+
}
|
|
13
|
+
function ruleTitle(finding) {
|
|
14
|
+
return finding.title.length > 0 ? finding.title : finding.ruleId;
|
|
9
15
|
}
|
|
10
|
-
export function renderSarif(artifact) {
|
|
16
|
+
export function renderSarif(artifact, options = {}) {
|
|
11
17
|
const rules = [];
|
|
12
18
|
const results = [];
|
|
13
19
|
const seenRules = new Set();
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
const findings = extractObservatoryFindings(artifact);
|
|
21
|
+
const artifactUri = options.artifactUri ?? defaultArtifactUri(artifact);
|
|
22
|
+
for (const finding of findings) {
|
|
23
|
+
if (!seenRules.has(finding.ruleId)) {
|
|
24
|
+
seenRules.add(finding.ruleId);
|
|
18
25
|
rules.push({
|
|
19
|
-
id: ruleId,
|
|
20
|
-
name:
|
|
21
|
-
shortDescription: { text:
|
|
22
|
-
defaultConfiguration: { level:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
: "note";
|
|
32
|
-
results.push({
|
|
33
|
-
ruleId,
|
|
34
|
-
level,
|
|
35
|
-
message: { text: diagnostic.replace(/^\[(high|medium|low)\]\s*/, "") },
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
else if (check.status !== "pass" && check.status !== "skipped" && check.status !== "unsupported") {
|
|
40
|
-
results.push({
|
|
41
|
-
ruleId,
|
|
42
|
-
level: levelFromStatus(check.status),
|
|
43
|
-
message: { text: check.message },
|
|
26
|
+
id: finding.ruleId,
|
|
27
|
+
name: ruleTitle(finding),
|
|
28
|
+
shortDescription: { text: ruleTitle(finding) },
|
|
29
|
+
defaultConfiguration: { level: levelFromSeverity(finding.severity) },
|
|
30
|
+
help: finding.recommendation ? { text: finding.recommendation } : undefined,
|
|
31
|
+
helpUri: `https://github.com/KryptosAI/mcp-observatory/tree/main/docs`,
|
|
32
|
+
properties: {
|
|
33
|
+
category: finding.category,
|
|
34
|
+
checkId: finding.checkId,
|
|
35
|
+
controlRefs: finding.controlRefs,
|
|
36
|
+
tags: ["mcp", "mcp-observatory", finding.category, ...finding.controlRefs],
|
|
37
|
+
},
|
|
44
38
|
});
|
|
45
39
|
}
|
|
40
|
+
results.push({
|
|
41
|
+
ruleId: finding.ruleId,
|
|
42
|
+
level: levelFromSeverity(finding.severity),
|
|
43
|
+
message: { text: finding.message },
|
|
44
|
+
locations: [{
|
|
45
|
+
physicalLocation: {
|
|
46
|
+
artifactLocation: { uri: artifactUri },
|
|
47
|
+
region: { startLine: 1 },
|
|
48
|
+
},
|
|
49
|
+
}],
|
|
50
|
+
partialFingerprints: {
|
|
51
|
+
"mcp-observatory/finding-id": finding.id,
|
|
52
|
+
},
|
|
53
|
+
properties: {
|
|
54
|
+
id: finding.id,
|
|
55
|
+
category: finding.category,
|
|
56
|
+
checkId: finding.checkId,
|
|
57
|
+
targetId: artifact.target.targetId,
|
|
58
|
+
subject: finding.subject,
|
|
59
|
+
severity: finding.severity,
|
|
60
|
+
controlRefs: finding.controlRefs,
|
|
61
|
+
tags: ["mcp", "mcp-observatory", finding.category, ...finding.controlRefs],
|
|
62
|
+
},
|
|
63
|
+
});
|
|
46
64
|
}
|
|
47
65
|
const sarif = {
|
|
48
66
|
$schema: "https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/schemas/sarif-schema-2.1.0.json",
|
|
@@ -57,6 +75,9 @@ export function renderSarif(artifact) {
|
|
|
57
75
|
rules,
|
|
58
76
|
},
|
|
59
77
|
},
|
|
78
|
+
automationDetails: {
|
|
79
|
+
id: `mcp-observatory/${artifact.target.targetId}`,
|
|
80
|
+
},
|
|
60
81
|
results,
|
|
61
82
|
},
|
|
62
83
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../../src/reporters/sarif.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../../src/reporters/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/src/storage.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export declare function defaultRunsDirectory(cwd?: string): string;
|
|
|
4
4
|
export declare function ensureDirectory(directoryPath: string): Promise<void>;
|
|
5
5
|
export declare function writeRunArtifact(artifact: RunArtifact, outDir: string): Promise<string>;
|
|
6
6
|
export declare function findLatestArtifact(outDir: string, targetId: string, excludePath?: string): Promise<string | null>;
|
|
7
|
+
export declare function findLatestSuccessfulRunArtifact(outDir: string): Promise<string | null>;
|
|
7
8
|
export declare function readArtifact(filePath: string): Promise<Artifact>;
|
package/dist/src/storage.js
CHANGED
|
@@ -34,6 +34,31 @@ export async function findLatestArtifact(outDir, targetId, excludePath) {
|
|
|
34
34
|
return null;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
+
export async function findLatestSuccessfulRunArtifact(outDir) {
|
|
38
|
+
try {
|
|
39
|
+
const entries = await readdir(outDir);
|
|
40
|
+
const candidates = entries
|
|
41
|
+
.filter((entry) => entry.endsWith(".json"))
|
|
42
|
+
.sort()
|
|
43
|
+
.reverse()
|
|
44
|
+
.map((entry) => path.join(outDir, entry));
|
|
45
|
+
for (const candidate of candidates) {
|
|
46
|
+
try {
|
|
47
|
+
const artifact = await readArtifact(candidate);
|
|
48
|
+
if (artifact.artifactType === "run" && artifact.gate === "pass" && !artifact.fatalError) {
|
|
49
|
+
return candidate;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Ignore malformed or stale files while looking for a usable last run.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
37
62
|
export async function readArtifact(filePath) {
|
|
38
63
|
const content = await readFile(filePath, "utf8");
|
|
39
64
|
const data = JSON.parse(content);
|
package/dist/src/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/src/telemetry.d.ts
CHANGED
|
@@ -48,6 +48,9 @@ export interface TelemetryEnrichment {
|
|
|
48
48
|
setupCiReady?: boolean;
|
|
49
49
|
setupCiFailCount?: number;
|
|
50
50
|
setupCiWarnCount?: number;
|
|
51
|
+
setupCiConversionStatus?: string;
|
|
52
|
+
setupCiPromptShown?: boolean;
|
|
53
|
+
setupCiAutoRequested?: boolean;
|
|
51
54
|
sampleReport?: boolean;
|
|
52
55
|
nightlyScan?: boolean;
|
|
53
56
|
issueCreated?: boolean;
|
|
@@ -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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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Agent Runtime Quickstart
|
|
2
|
+
|
|
3
|
+
This is for maintainers of autonomous agents, OpenClaw-style productivity systems, coding agents, MCP gateways, and bot runtimes.
|
|
4
|
+
|
|
5
|
+
MCP Observatory gives your agent a read-only preflight for MCP tools before it depends on them.
|
|
6
|
+
|
|
7
|
+
## Why Agents Need This
|
|
8
|
+
|
|
9
|
+
Autonomous agents fail badly when their tools silently drift. A tool can still install while its schema changes, startup breaks, auth assumptions change, or a dangerous parameter becomes easy for an agent to call.
|
|
10
|
+
|
|
11
|
+
Observatory checks the tool surface before the agent trusts it.
|
|
12
|
+
|
|
13
|
+
## Fast Local Check
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx @kryptosai/mcp-observatory test npx -y your-mcp-server
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
For deeper checks:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx @kryptosai/mcp-observatory test npx -y your-mcp-server --deep --security
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## OpenClaw Agent Template
|
|
26
|
+
|
|
27
|
+
If you maintain an OpenClaw-style productivity system, copy the ready-to-use MCP reliability preflight agent:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
docs/openclaw-agent-template/SOUL.md
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Use it as a recurring release, dependency-update, or tool-adoption check before your agent trusts an MCP server.
|
|
34
|
+
|
|
35
|
+
## Add Read-Only CI
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx @kryptosai/mcp-observatory setup-ci --all --command "npx -y your-mcp-server"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This creates a small adoption kit:
|
|
42
|
+
|
|
43
|
+
- `.github/workflows/mcp-observatory.yml`
|
|
44
|
+
- `mcp-observatory.target.json`
|
|
45
|
+
- report and badge snippets
|
|
46
|
+
- a maintainer PR body
|
|
47
|
+
- a setup doctor path
|
|
48
|
+
|
|
49
|
+
Run:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npx @kryptosai/mcp-observatory setup-ci --doctor
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## What To Contribute Back
|
|
56
|
+
|
|
57
|
+
The highest-value contribution is a safe, real target that teaches agents what healthy MCP behavior looks like.
|
|
58
|
+
|
|
59
|
+
Open an issue with:
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
Project:
|
|
63
|
+
Safe startup command:
|
|
64
|
+
Needs secrets? yes/no
|
|
65
|
+
Agent tools/skills that depend on MCP:
|
|
66
|
+
Expected healthy behavior:
|
|
67
|
+
What should an autonomous agent know before trusting this tool?
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Good targets:
|
|
71
|
+
|
|
72
|
+
- start in CI without private credentials
|
|
73
|
+
- avoid destructive default actions
|
|
74
|
+
- expose tools/prompts/resources that agents actually call
|
|
75
|
+
- produce useful report evidence
|
|
76
|
+
|
|
77
|
+
Avoid targets that require private OAuth, paid services, or live destructive side effects.
|
|
78
|
+
|
|
79
|
+
## Agent-Readable Signals To Ask For
|
|
80
|
+
|
|
81
|
+
If you are integrating Observatory into an agent runtime, these are the most useful signals:
|
|
82
|
+
|
|
83
|
+
- did the MCP server start?
|
|
84
|
+
- which tools/prompts/resources are available?
|
|
85
|
+
- did any schemas change since the last known-good run?
|
|
86
|
+
- are there risky parameter shapes?
|
|
87
|
+
- did a safe tool invocation pass?
|
|
88
|
+
- should the agent block, warn, or continue?
|
|
89
|
+
|
|
90
|
+
## Maintainer-Friendly Positioning
|
|
91
|
+
|
|
92
|
+
Use this wording when proposing the check to another project:
|
|
93
|
+
|
|
94
|
+
```md
|
|
95
|
+
This adds a read-only MCP Observatory check for MCP compatibility, schema drift, and common schema/security footguns.
|
|
96
|
+
|
|
97
|
+
It does not require an account, hosted service, or secrets. The check can stay advisory while the signal is tuned.
|
|
98
|
+
```
|