@kryptosai/mcp-observatory 0.3.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/LICENSE +21 -0
- package/README.md +228 -0
- package/dist/src/adapters/http.d.ts +5 -0
- package/dist/src/adapters/http.js +54 -0
- package/dist/src/adapters/http.js.map +1 -0
- package/dist/src/adapters/local-process.d.ts +19 -0
- package/dist/src/adapters/local-process.js +63 -0
- package/dist/src/adapters/local-process.js.map +1 -0
- package/dist/src/checks/base.d.ts +28 -0
- package/dist/src/checks/base.js +42 -0
- package/dist/src/checks/base.js.map +1 -0
- package/dist/src/checks/list-check.d.ts +16 -0
- package/dist/src/checks/list-check.js +78 -0
- package/dist/src/checks/list-check.js.map +1 -0
- package/dist/src/checks/prompts.d.ts +2 -0
- package/dist/src/checks/prompts.js +11 -0
- package/dist/src/checks/prompts.js.map +1 -0
- package/dist/src/checks/resources.d.ts +2 -0
- package/dist/src/checks/resources.js +163 -0
- package/dist/src/checks/resources.js.map +1 -0
- package/dist/src/checks/tools-invoke.d.ts +2 -0
- package/dist/src/checks/tools-invoke.js +107 -0
- package/dist/src/checks/tools-invoke.js.map +1 -0
- package/dist/src/checks/tools.d.ts +2 -0
- package/dist/src/checks/tools.js +12 -0
- package/dist/src/checks/tools.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +266 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/diff.d.ts +2 -0
- package/dist/src/diff.js +98 -0
- package/dist/src/diff.js.map +1 -0
- package/dist/src/discovery.d.ts +7 -0
- package/dist/src/discovery.js +116 -0
- package/dist/src/discovery.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/reporters/common.d.ts +7 -0
- package/dist/src/reporters/common.js +63 -0
- package/dist/src/reporters/common.js.map +1 -0
- package/dist/src/reporters/html.d.ts +2 -0
- package/dist/src/reporters/html.js +228 -0
- package/dist/src/reporters/html.js.map +1 -0
- package/dist/src/reporters/markdown.d.ts +2 -0
- package/dist/src/reporters/markdown.js +231 -0
- package/dist/src/reporters/markdown.js.map +1 -0
- package/dist/src/reporters/terminal.d.ts +2 -0
- package/dist/src/reporters/terminal.js +110 -0
- package/dist/src/reporters/terminal.js.map +1 -0
- package/dist/src/runner.d.ts +5 -0
- package/dist/src/runner.js +138 -0
- package/dist/src/runner.js.map +1 -0
- package/dist/src/schema-diff.d.ts +6 -0
- package/dist/src/schema-diff.js +73 -0
- package/dist/src/schema-diff.js.map +1 -0
- package/dist/src/storage.d.ts +6 -0
- package/dist/src/storage.js +32 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/types.d.ts +120 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/failure-diagnosis.d.ts +2 -0
- package/dist/src/utils/failure-diagnosis.js +90 -0
- package/dist/src/utils/failure-diagnosis.js.map +1 -0
- package/dist/src/utils/ids.d.ts +2 -0
- package/dist/src/utils/ids.js +13 -0
- package/dist/src/utils/ids.js.map +1 -0
- package/dist/src/utils/schema-stub.d.ts +14 -0
- package/dist/src/utils/schema-stub.js +61 -0
- package/dist/src/utils/schema-stub.js.map +1 -0
- package/dist/src/validate.d.ts +4 -0
- package/dist/src/validate.js +97 -0
- package/dist/src/validate.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +21 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +76 -0
- package/schemas/diff-artifact.schema.json +132 -0
- package/schemas/run-artifact.schema.json +245 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAI1E,MAAM,UAAU,oBAAoB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAAqB;IACzD,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAqB,EACrB,MAAc;IAEd,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,OAAO,CACrE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CACzB,OAAO,CAAC;IACT,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,IAAgC,CAAC,cAAc,CAAC,KAAK,MAAM,EAAE,CAAC;QACtI,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,+EAA+E;IAC/E,mEAAmE;IACnE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,IAAgC,CAAC,cAAc,CAAC,KAAK,KAAK,EAAE,CAAC;QACrI,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,sGAAsG;IACtG,OAAO,IAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export declare const SCHEMA_VERSION = "1.0.0";
|
|
2
|
+
export type ArtifactType = "run" | "diff";
|
|
3
|
+
export type Gate = "pass" | "fail";
|
|
4
|
+
export type CheckStatus = "pass" | "fail" | "partial" | "unsupported" | "flaky" | "skipped";
|
|
5
|
+
export type CheckId = "tools" | "prompts" | "resources" | "tools-invoke";
|
|
6
|
+
export declare const STATUS_RANK: Record<CheckStatus, number>;
|
|
7
|
+
export interface LocalProcessTargetConfig {
|
|
8
|
+
targetId: string;
|
|
9
|
+
adapter: "local-process";
|
|
10
|
+
command: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
cwd?: string;
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
metadata?: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export interface HttpTargetConfig {
|
|
18
|
+
targetId: string;
|
|
19
|
+
adapter: "http";
|
|
20
|
+
url: string;
|
|
21
|
+
authToken?: string;
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
metadata?: Record<string, string>;
|
|
25
|
+
}
|
|
26
|
+
export type TargetConfig = LocalProcessTargetConfig | HttpTargetConfig;
|
|
27
|
+
export interface TargetSnapshot {
|
|
28
|
+
targetId: string;
|
|
29
|
+
adapter: TargetConfig["adapter"];
|
|
30
|
+
command: string;
|
|
31
|
+
args: string[];
|
|
32
|
+
url?: string;
|
|
33
|
+
cwd?: string;
|
|
34
|
+
metadata?: Record<string, string>;
|
|
35
|
+
serverVersion?: string;
|
|
36
|
+
serverName?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface EnvironmentSnapshot {
|
|
39
|
+
platform: string;
|
|
40
|
+
nodeVersion: string;
|
|
41
|
+
}
|
|
42
|
+
export interface EvidenceSummary {
|
|
43
|
+
endpoint: string;
|
|
44
|
+
advertised: boolean;
|
|
45
|
+
responded: boolean;
|
|
46
|
+
minimalShapePresent: boolean;
|
|
47
|
+
itemCount?: number;
|
|
48
|
+
identifiers?: string[];
|
|
49
|
+
diagnostics?: string[];
|
|
50
|
+
schemas?: Record<string, object>;
|
|
51
|
+
}
|
|
52
|
+
export interface CheckResult {
|
|
53
|
+
id: CheckId;
|
|
54
|
+
capability: CheckId;
|
|
55
|
+
status: CheckStatus;
|
|
56
|
+
durationMs: number;
|
|
57
|
+
message: string;
|
|
58
|
+
evidence: EvidenceSummary[];
|
|
59
|
+
}
|
|
60
|
+
export interface StatusCounts {
|
|
61
|
+
total: number;
|
|
62
|
+
pass: number;
|
|
63
|
+
fail: number;
|
|
64
|
+
partial: number;
|
|
65
|
+
unsupported: number;
|
|
66
|
+
flaky: number;
|
|
67
|
+
skipped: number;
|
|
68
|
+
}
|
|
69
|
+
export interface RunSummary extends StatusCounts {
|
|
70
|
+
gate: Gate;
|
|
71
|
+
}
|
|
72
|
+
export interface RunArtifact {
|
|
73
|
+
artifactType: "run";
|
|
74
|
+
schemaVersion: typeof SCHEMA_VERSION;
|
|
75
|
+
gate: Gate;
|
|
76
|
+
runId: string;
|
|
77
|
+
createdAt: string;
|
|
78
|
+
toolVersion: string;
|
|
79
|
+
target: TargetSnapshot;
|
|
80
|
+
environment: EnvironmentSnapshot;
|
|
81
|
+
summary: RunSummary;
|
|
82
|
+
checks: CheckResult[];
|
|
83
|
+
fatalError?: string;
|
|
84
|
+
}
|
|
85
|
+
export interface DiffEntry {
|
|
86
|
+
id: CheckId;
|
|
87
|
+
capability: CheckId;
|
|
88
|
+
fromStatus?: CheckStatus;
|
|
89
|
+
toStatus?: CheckStatus;
|
|
90
|
+
message: string;
|
|
91
|
+
}
|
|
92
|
+
export interface SchemaDriftEntry {
|
|
93
|
+
capability: CheckId;
|
|
94
|
+
name: string;
|
|
95
|
+
changes: string[];
|
|
96
|
+
}
|
|
97
|
+
export interface DiffSummary {
|
|
98
|
+
regressions: number;
|
|
99
|
+
recoveries: number;
|
|
100
|
+
unchanged: number;
|
|
101
|
+
added: number;
|
|
102
|
+
removed: number;
|
|
103
|
+
schemaDriftCount?: number;
|
|
104
|
+
gate: Gate;
|
|
105
|
+
}
|
|
106
|
+
export interface DiffArtifact {
|
|
107
|
+
artifactType: "diff";
|
|
108
|
+
schemaVersion: typeof SCHEMA_VERSION;
|
|
109
|
+
gate: Gate;
|
|
110
|
+
baseRunId: string;
|
|
111
|
+
headRunId: string;
|
|
112
|
+
createdAt: string;
|
|
113
|
+
summary: DiffSummary;
|
|
114
|
+
regressions: DiffEntry[];
|
|
115
|
+
recoveries: DiffEntry[];
|
|
116
|
+
unchanged: DiffEntry[];
|
|
117
|
+
added: DiffEntry[];
|
|
118
|
+
removed: DiffEntry[];
|
|
119
|
+
schemaDrift?: SchemaDriftEntry[];
|
|
120
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAatC,MAAM,CAAC,MAAM,WAAW,GAAgC;IACtD,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;CACnE,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
function buildCommand(target) {
|
|
2
|
+
if (target.adapter === "http") {
|
|
3
|
+
return target.url;
|
|
4
|
+
}
|
|
5
|
+
return [target.command, ...target.args].join(" ");
|
|
6
|
+
}
|
|
7
|
+
function trimLines(lines, limit = 5) {
|
|
8
|
+
return lines.slice(-limit);
|
|
9
|
+
}
|
|
10
|
+
function classifyFailure(message) {
|
|
11
|
+
const lower = message.toLowerCase();
|
|
12
|
+
if (lower.includes("timed out")) {
|
|
13
|
+
return {
|
|
14
|
+
diagnosis: "The server did not complete MCP initialization before the configured timeout.",
|
|
15
|
+
likelyCauses: [
|
|
16
|
+
"The package may start a browser, app shell, or background service instead of staying attached to stdio.",
|
|
17
|
+
"The target may need extra startup flags, credentials, or environment variables before it becomes usable.",
|
|
18
|
+
"The timeout may simply be too low for this package on first boot."
|
|
19
|
+
],
|
|
20
|
+
nextSteps: [
|
|
21
|
+
"Run the command manually and confirm it stays attached to stdio instead of launching and idling elsewhere.",
|
|
22
|
+
"Check the package docs for required flags, auth, or setup steps before MCP initialization.",
|
|
23
|
+
"If the command is otherwise correct, raise `timeoutMs` and try again."
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (lower.includes("connection closed") || lower.includes("closed")) {
|
|
28
|
+
return {
|
|
29
|
+
diagnosis: "The process exited or detached before MCP initialization completed.",
|
|
30
|
+
likelyCauses: [
|
|
31
|
+
"The package may expect extra startup arguments or environment variables.",
|
|
32
|
+
"The package may not behave like a plain local-process stdio target under this invocation.",
|
|
33
|
+
"The server may be crashing immediately and only leaving clues on stderr."
|
|
34
|
+
],
|
|
35
|
+
nextSteps: [
|
|
36
|
+
"Run the command manually and look for usage output, auth prompts, or crash text.",
|
|
37
|
+
"Check whether the package expects a different transport or an app-oriented startup flow.",
|
|
38
|
+
"Use the recent stderr lines below before assuming this is a harness bug."
|
|
39
|
+
]
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (lower.includes("enoent") || lower.includes("spawn")) {
|
|
43
|
+
return {
|
|
44
|
+
diagnosis: "The command could not be started successfully.",
|
|
45
|
+
likelyCauses: [
|
|
46
|
+
"The executable may be missing from PATH.",
|
|
47
|
+
"The target may need `npx` or a different command name.",
|
|
48
|
+
"The cwd or local package layout may not match the intended invocation."
|
|
49
|
+
],
|
|
50
|
+
nextSteps: [
|
|
51
|
+
"Run the command manually and confirm the executable exists.",
|
|
52
|
+
"Switch to `npx -y <package>` or an explicit binary path if needed.",
|
|
53
|
+
"Double-check the target `cwd`, `command`, and `args` values."
|
|
54
|
+
]
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
diagnosis: "The target did not behave like a healthy plain stdio MCP server during startup.",
|
|
59
|
+
likelyCauses: [
|
|
60
|
+
"The package may need additional startup configuration.",
|
|
61
|
+
"The package may prefer a different transport or runtime shape.",
|
|
62
|
+
"The process may be failing before MCP initialize is reachable."
|
|
63
|
+
],
|
|
64
|
+
nextSteps: [
|
|
65
|
+
"Run the command manually and inspect stdout/stderr behavior.",
|
|
66
|
+
"Check package docs for startup requirements before assuming protocol failure.",
|
|
67
|
+
"Treat this as ecosystem signal first; only change the harness if the package should work over stdio as invoked."
|
|
68
|
+
]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function formatConnectionFailureDiagnosis(target, rawMessage, stderrLines) {
|
|
72
|
+
const details = classifyFailure(rawMessage);
|
|
73
|
+
const recentStderr = trimLines(stderrLines);
|
|
74
|
+
const lines = [
|
|
75
|
+
`Could not establish a plain stdio MCP session for target \`${target.targetId}\`.`,
|
|
76
|
+
`Command: ${buildCommand(target)}`,
|
|
77
|
+
`Diagnosis: ${details.diagnosis}`,
|
|
78
|
+
`Raw error: ${rawMessage}`,
|
|
79
|
+
`Likely causes:`,
|
|
80
|
+
...details.likelyCauses.map((cause) => `- ${cause}`),
|
|
81
|
+
`Next steps:`,
|
|
82
|
+
...details.nextSteps.map((step) => `- ${step}`)
|
|
83
|
+
];
|
|
84
|
+
if (recentStderr.length > 0) {
|
|
85
|
+
lines.push("Recent stderr:");
|
|
86
|
+
lines.push(...recentStderr.map((line) => `- ${line}`));
|
|
87
|
+
}
|
|
88
|
+
return lines.join("\n");
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=failure-diagnosis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-diagnosis.js","sourceRoot":"","sources":["../../../src/utils/failure-diagnosis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
export function buildRunId(date = new Date()) {
|
|
3
|
+
const timestamp = date.toISOString().replaceAll(":", "").replaceAll(".", "");
|
|
4
|
+
return `run_${timestamp}_${randomUUID().slice(0, 8)}`;
|
|
5
|
+
}
|
|
6
|
+
export function slugify(value) {
|
|
7
|
+
return value
|
|
8
|
+
.toLowerCase()
|
|
9
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
10
|
+
.replace(/^-+|-+$/g, "")
|
|
11
|
+
.slice(0, 64);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../src/utils/ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,UAAU,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO,SAAS,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate minimal valid JSON from a JSON Schema inputSchema.
|
|
3
|
+
* Used to construct arguments for safe tool invocation during health checks.
|
|
4
|
+
*/
|
|
5
|
+
export declare function stubFromSchema(schema: Record<string, unknown> | undefined): Record<string, unknown>;
|
|
6
|
+
/**
|
|
7
|
+
* Returns true if a tool is safe to invoke during health checks:
|
|
8
|
+
* - Has no required parameters, OR
|
|
9
|
+
* - Has readOnlyHint annotation set to true
|
|
10
|
+
*/
|
|
11
|
+
export declare function isSafeToInvoke(tool: {
|
|
12
|
+
inputSchema?: Record<string, unknown>;
|
|
13
|
+
annotations?: Record<string, unknown>;
|
|
14
|
+
}): boolean;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate minimal valid JSON from a JSON Schema inputSchema.
|
|
3
|
+
* Used to construct arguments for safe tool invocation during health checks.
|
|
4
|
+
*/
|
|
5
|
+
export function stubFromSchema(schema) {
|
|
6
|
+
if (schema === undefined) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
const required = Array.isArray(schema["required"]) ? schema["required"] : [];
|
|
10
|
+
const properties = (schema["properties"] ?? {});
|
|
11
|
+
if (required.length === 0) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
const stub = {};
|
|
15
|
+
for (const field of required) {
|
|
16
|
+
const prop = properties[field];
|
|
17
|
+
stub[field] = stubValue(prop);
|
|
18
|
+
}
|
|
19
|
+
return stub;
|
|
20
|
+
}
|
|
21
|
+
function stubValue(prop) {
|
|
22
|
+
if (prop === undefined) {
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
switch (prop["type"]) {
|
|
26
|
+
case "string":
|
|
27
|
+
return "";
|
|
28
|
+
case "number":
|
|
29
|
+
case "integer":
|
|
30
|
+
return 0;
|
|
31
|
+
case "boolean":
|
|
32
|
+
return false;
|
|
33
|
+
case "array":
|
|
34
|
+
return [];
|
|
35
|
+
case "object":
|
|
36
|
+
return {};
|
|
37
|
+
default:
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Returns true if a tool is safe to invoke during health checks:
|
|
43
|
+
* - Has no required parameters, OR
|
|
44
|
+
* - Has readOnlyHint annotation set to true
|
|
45
|
+
*/
|
|
46
|
+
export function isSafeToInvoke(tool) {
|
|
47
|
+
const annotations = tool.annotations;
|
|
48
|
+
if (annotations?.["readOnlyHint"] === true) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
const schema = tool.inputSchema;
|
|
52
|
+
if (schema === undefined) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
const required = schema["required"];
|
|
56
|
+
if (!Array.isArray(required) || required.length === 0) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=schema-stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-stub.js","sourceRoot":"","sources":["../../../src/utils/schema-stub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAA2C;IACxE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,UAAU,CAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAA4C,CAAC;IAE3F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,IAAyC;IAC1D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC;QACZ;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAG9B;IACC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,IAAI,WAAW,EAAE,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DiffArtifact, RunArtifact, TargetConfig } from "./types.js";
|
|
2
|
+
export declare function validateTargetConfig(data: unknown): TargetConfig;
|
|
3
|
+
export declare function validateRunArtifact(data: unknown): RunArtifact;
|
|
4
|
+
export declare function validateDiffArtifact(data: unknown): DiffArtifact;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
function isObject(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
function requireString(obj, field, label) {
|
|
5
|
+
const value = obj[field];
|
|
6
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
7
|
+
throw new Error(`${label} is missing required field '${field}'.`);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function requireArray(obj, field, label) {
|
|
12
|
+
const value = obj[field];
|
|
13
|
+
if (!Array.isArray(value)) {
|
|
14
|
+
throw new Error(`${label} is missing required field '${field}' (expected an array).`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
export function validateTargetConfig(data) {
|
|
19
|
+
if (!isObject(data)) {
|
|
20
|
+
throw new Error("Target config must be a JSON object.");
|
|
21
|
+
}
|
|
22
|
+
const targetId = requireString(data, "targetId", "Target config");
|
|
23
|
+
const adapter = requireString(data, "adapter", "Target config");
|
|
24
|
+
if (adapter === "http") {
|
|
25
|
+
const url = requireString(data, "url", "Target config");
|
|
26
|
+
return {
|
|
27
|
+
targetId,
|
|
28
|
+
adapter: "http",
|
|
29
|
+
url,
|
|
30
|
+
authToken: typeof data["authToken"] === "string" ? data["authToken"] : undefined,
|
|
31
|
+
headers: isObject(data["headers"]) ? data["headers"] : undefined,
|
|
32
|
+
timeoutMs: typeof data["timeoutMs"] === "number" ? data["timeoutMs"] : undefined,
|
|
33
|
+
metadata: isObject(data["metadata"]) ? data["metadata"] : undefined,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (adapter !== "local-process") {
|
|
37
|
+
throw new Error(`Target config has unsupported adapter '${adapter}'. Supported: 'local-process', 'http'.`);
|
|
38
|
+
}
|
|
39
|
+
const command = requireString(data, "command", "Target config");
|
|
40
|
+
const argsRaw = requireArray(data, "args", "Target config");
|
|
41
|
+
const args = argsRaw.map((arg, i) => {
|
|
42
|
+
if (typeof arg !== "string") {
|
|
43
|
+
throw new Error(`Target config args[${i}] must be a string.`);
|
|
44
|
+
}
|
|
45
|
+
return arg;
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
targetId,
|
|
49
|
+
adapter,
|
|
50
|
+
command,
|
|
51
|
+
args,
|
|
52
|
+
cwd: typeof data["cwd"] === "string" ? data["cwd"] : undefined,
|
|
53
|
+
env: isObject(data["env"]) ? data["env"] : undefined,
|
|
54
|
+
timeoutMs: typeof data["timeoutMs"] === "number" ? data["timeoutMs"] : undefined,
|
|
55
|
+
metadata: isObject(data["metadata"]) ? data["metadata"] : undefined,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function validateRunArtifact(data) {
|
|
59
|
+
if (!isObject(data)) {
|
|
60
|
+
throw new Error("Expected a run artifact but got a non-object value.");
|
|
61
|
+
}
|
|
62
|
+
if (data["artifactType"] !== "run") {
|
|
63
|
+
throw new Error(`Expected a run artifact but got artifactType='${String(data["artifactType"])}'.`);
|
|
64
|
+
}
|
|
65
|
+
requireString(data, "runId", "Run artifact");
|
|
66
|
+
requireString(data, "createdAt", "Run artifact");
|
|
67
|
+
requireString(data, "schemaVersion", "Run artifact");
|
|
68
|
+
requireString(data, "toolVersion", "Run artifact");
|
|
69
|
+
requireArray(data, "checks", "Run artifact");
|
|
70
|
+
if (!isObject(data["target"])) {
|
|
71
|
+
throw new Error("Run artifact is missing required field 'target'.");
|
|
72
|
+
}
|
|
73
|
+
if (!isObject(data["environment"])) {
|
|
74
|
+
throw new Error("Run artifact is missing required field 'environment'.");
|
|
75
|
+
}
|
|
76
|
+
if (!isObject(data["summary"])) {
|
|
77
|
+
throw new Error("Run artifact is missing required field 'summary'.");
|
|
78
|
+
}
|
|
79
|
+
return data;
|
|
80
|
+
}
|
|
81
|
+
export function validateDiffArtifact(data) {
|
|
82
|
+
if (!isObject(data)) {
|
|
83
|
+
throw new Error("Expected a diff artifact but got a non-object value.");
|
|
84
|
+
}
|
|
85
|
+
if (data["artifactType"] !== "diff") {
|
|
86
|
+
throw new Error(`Expected a diff artifact but got artifactType='${String(data["artifactType"])}'.`);
|
|
87
|
+
}
|
|
88
|
+
requireString(data, "baseRunId", "Diff artifact");
|
|
89
|
+
requireString(data, "headRunId", "Diff artifact");
|
|
90
|
+
requireString(data, "createdAt", "Diff artifact");
|
|
91
|
+
requireString(data, "schemaVersion", "Diff artifact");
|
|
92
|
+
if (!isObject(data["summary"])) {
|
|
93
|
+
throw new Error("Diff artifact is missing required field 'summary'.");
|
|
94
|
+
}
|
|
95
|
+
return data;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const TOOL_VERSION: string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
function resolveVersion() {
|
|
5
|
+
const dir = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
// Walk up looking for package.json (works in both src/ dev and dist/src/ packed)
|
|
7
|
+
for (const relative of ["../package.json", "../../package.json"]) {
|
|
8
|
+
try {
|
|
9
|
+
const content = readFileSync(path.resolve(dir, relative), "utf8");
|
|
10
|
+
const pkg = JSON.parse(content);
|
|
11
|
+
if (pkg.version)
|
|
12
|
+
return pkg.version;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// continue searching
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return "0.0.0";
|
|
19
|
+
}
|
|
20
|
+
export const TOOL_VERSION = resolveVersion();
|
|
21
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,iFAAiF;IACjF,KAAK,MAAM,QAAQ,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyB,CAAC;YACxD,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kryptosai/mcp-observatory",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Regression intelligence for MCP targets: detect, diff, and explain interoperability drift over time.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"private": false,
|
|
8
|
+
"homepage": "https://github.com/KryptosAI/mcp-observatory#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/KryptosAI/mcp-observatory.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/KryptosAI/mcp-observatory/issues"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=20"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"main": "./dist/src/index.js",
|
|
23
|
+
"types": "./dist/src/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": "./dist/src/index.js"
|
|
26
|
+
},
|
|
27
|
+
"bin": {
|
|
28
|
+
"mcp-observatory": "./dist/src/cli.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist/src",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE",
|
|
34
|
+
"schemas"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc -p tsconfig.json",
|
|
38
|
+
"cli": "tsx src/cli.ts",
|
|
39
|
+
"integration:real": "tsx scripts/run-real-server-matrix.ts",
|
|
40
|
+
"lint": "eslint .",
|
|
41
|
+
"prepack": "npm run build",
|
|
42
|
+
"proof:refresh": "tsx scripts/refresh-proof-artifacts.ts",
|
|
43
|
+
"release:prep": "node scripts/release.mjs",
|
|
44
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
45
|
+
"test": "vitest run",
|
|
46
|
+
"validate:artifacts": "tsx scripts/validate-artifacts.ts",
|
|
47
|
+
"verify:packed-install": "node scripts/verify-packed-install.mjs",
|
|
48
|
+
"smoke": "npm run cli -- run --target tests/fixtures/sample-target-config.json && npm run cli -- diff --base tests/fixtures/sample-run-a.json --head tests/fixtures/sample-run-b.json"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"mcp",
|
|
52
|
+
"model-context-protocol",
|
|
53
|
+
"cli",
|
|
54
|
+
"regression-testing",
|
|
55
|
+
"interoperability",
|
|
56
|
+
"observability"
|
|
57
|
+
],
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
60
|
+
"commander": "14.0.2"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"ajv": "8.17.1",
|
|
64
|
+
"@eslint/js": "9.39.1",
|
|
65
|
+
"@types/node": "24.10.1",
|
|
66
|
+
"@typescript-eslint/eslint-plugin": "8.46.3",
|
|
67
|
+
"@typescript-eslint/parser": "8.46.3",
|
|
68
|
+
"eslint": "9.39.1",
|
|
69
|
+
"globals": "16.5.0",
|
|
70
|
+
"tsx": "4.20.6",
|
|
71
|
+
"typescript": "5.9.3",
|
|
72
|
+
"typescript-eslint": "8.46.3",
|
|
73
|
+
"vitest": "4.0.8",
|
|
74
|
+
"zod": "4.1.12"
|
|
75
|
+
}
|
|
76
|
+
}
|