mcprigor 1.0.0-rc.1
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 +17 -0
- package/README.md +233 -0
- package/dist/assertions.d.ts +4 -0
- package/dist/assertions.d.ts.map +1 -0
- package/dist/assertions.js +101 -0
- package/dist/assertions.js.map +1 -0
- package/dist/author.d.ts +57 -0
- package/dist/author.d.ts.map +1 -0
- package/dist/author.js +134 -0
- package/dist/author.js.map +1 -0
- package/dist/canonical.d.ts +4 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +17 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +265 -0
- package/dist/cli.js.map +1 -0
- package/dist/contract.d.ts +28 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +138 -0
- package/dist/contract.js.map +1 -0
- package/dist/data.d.ts +24 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +367 -0
- package/dist/data.js.map +1 -0
- package/dist/discovery.d.ts +6 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +82 -0
- package/dist/discovery.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/extension-host.d.ts +20 -0
- package/dist/extension-host.d.ts.map +1 -0
- package/dist/extension-host.js +52 -0
- package/dist/extension-host.js.map +1 -0
- package/dist/extension-sdk.d.ts +22 -0
- package/dist/extension-sdk.d.ts.map +1 -0
- package/dist/extension-sdk.js +3 -0
- package/dist/extension-sdk.js.map +1 -0
- package/dist/extension-worker.d.ts +2 -0
- package/dist/extension-worker.d.ts.map +1 -0
- package/dist/extension-worker.js +27 -0
- package/dist/extension-worker.js.map +1 -0
- package/dist/extensions.d.ts +15 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +60 -0
- package/dist/extensions.js.map +1 -0
- package/dist/imports.d.ts +7 -0
- package/dist/imports.d.ts.map +1 -0
- package/dist/imports.js +41 -0
- package/dist/imports.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/language.d.ts +34 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +102 -0
- package/dist/language.js.map +1 -0
- package/dist/loader.d.ts +4 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +51 -0
- package/dist/loader.js.map +1 -0
- package/dist/parity.d.ts +23 -0
- package/dist/parity.d.ts.map +1 -0
- package/dist/parity.js +77 -0
- package/dist/parity.js.map +1 -0
- package/dist/path.d.ts +3 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +71 -0
- package/dist/path.js.map +1 -0
- package/dist/qa-advanced.d.ts +8 -0
- package/dist/qa-advanced.d.ts.map +1 -0
- package/dist/qa-advanced.js +239 -0
- package/dist/qa-advanced.js.map +1 -0
- package/dist/qa-language.d.ts +4 -0
- package/dist/qa-language.d.ts.map +1 -0
- package/dist/qa-language.js +385 -0
- package/dist/qa-language.js.map +1 -0
- package/dist/qa-loader.d.ts +4 -0
- package/dist/qa-loader.d.ts.map +1 -0
- package/dist/qa-loader.js +22 -0
- package/dist/qa-loader.js.map +1 -0
- package/dist/redact.d.ts +7 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +63 -0
- package/dist/redact.js.map +1 -0
- package/dist/replay.d.ts +17 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +48 -0
- package/dist/replay.js.map +1 -0
- package/dist/reporters.d.ts +6 -0
- package/dist/reporters.d.ts.map +1 -0
- package/dist/reporters.js +52 -0
- package/dist/reporters.js.map +1 -0
- package/dist/runner.d.ts +16 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +304 -0
- package/dist/runner.js.map +1 -0
- package/dist/schema.d.ts +446 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +117 -0
- package/dist/schema.js.map +1 -0
- package/dist/session.d.ts +5 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +111 -0
- package/dist/session.js.map +1 -0
- package/dist/snapshots.d.ts +28 -0
- package/dist/snapshots.d.ts.map +1 -0
- package/dist/snapshots.js +87 -0
- package/dist/snapshots.js.map +1 -0
- package/dist/starter.d.ts +3 -0
- package/dist/starter.d.ts.map +1 -0
- package/dist/starter.js +34 -0
- package/dist/starter.js.map +1 -0
- package/dist/state.d.ts +13 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +29 -0
- package/dist/state.js.map +1 -0
- package/dist/trace.d.ts +57 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +94 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +245 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace.d.ts +10 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +144 -0
- package/dist/workspace.js.map +1 -0
- package/docs/CLI-REFERENCE.md +167 -0
- package/docs/COMPATIBILITY.md +42 -0
- package/docs/CONTRACT-DRIFT.md +42 -0
- package/docs/DATA-AND-REUSE.md +213 -0
- package/docs/DATA-ENGINEERING.md +96 -0
- package/docs/ENGINEER-SETUP.md +176 -0
- package/docs/ERROR-MODEL.md +24 -0
- package/docs/EVIDENCE.md +58 -0
- package/docs/EXTENSION-SDK.md +76 -0
- package/docs/FILE-EXTENSION.md +52 -0
- package/docs/GETTING-STARTED.md +126 -0
- package/docs/GUIDED-AUTHORING.md +80 -0
- package/docs/LANDSCAPE.md +81 -0
- package/docs/LANGUAGE-SPEC.md +317 -0
- package/docs/MCP-NATIVE.md +111 -0
- package/docs/PLAIN-LANGUAGE-COOKBOOK.md +219 -0
- package/docs/QA-GUIDE.md +128 -0
- package/docs/QA-WORKSPACE.md +78 -0
- package/docs/README.md +55 -0
- package/docs/SECURITY-AND-RETENTION.md +37 -0
- package/docs/SNAPSHOTS-AND-REPLAY.md +85 -0
- package/docs/SPECIFICATION.md +178 -0
- package/docs/STATE-AND-DEPENDENCIES.md +106 -0
- package/docs/TRANSPORT-PARITY.md +98 -0
- package/docs/TROUBLESHOOTING.md +199 -0
- package/editors/mcpr-language.json +16 -0
- package/package.json +70 -0
- package/workspace-assets/app.js +1 -0
- package/workspace-assets/index.html +1 -0
- package/workspace-assets/style.css +1 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
export interface StdioTarget {
|
|
2
|
+
transport: "stdio";
|
|
3
|
+
command: string;
|
|
4
|
+
args?: string[];
|
|
5
|
+
cwd?: string;
|
|
6
|
+
env?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export interface HttpTarget {
|
|
9
|
+
transport: "streamable-http";
|
|
10
|
+
url: string;
|
|
11
|
+
headers?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
export type Target = StdioTarget | HttpTarget;
|
|
14
|
+
export interface JsonAssertion {
|
|
15
|
+
path?: string;
|
|
16
|
+
equals?: unknown;
|
|
17
|
+
notEquals?: unknown;
|
|
18
|
+
exists?: boolean;
|
|
19
|
+
type?: "string" | "number" | "boolean" | "object" | "array" | "null";
|
|
20
|
+
contains?: unknown;
|
|
21
|
+
length?: number;
|
|
22
|
+
matches?: string;
|
|
23
|
+
schema?: Record<string, unknown>;
|
|
24
|
+
snapshot?: {
|
|
25
|
+
name: string;
|
|
26
|
+
ignore?: string[];
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface StepAssertion {
|
|
30
|
+
status?: "success" | "error";
|
|
31
|
+
error?: {
|
|
32
|
+
code?: number;
|
|
33
|
+
message?: string;
|
|
34
|
+
matches?: string;
|
|
35
|
+
};
|
|
36
|
+
json?: JsonAssertion | JsonAssertion[];
|
|
37
|
+
}
|
|
38
|
+
export interface StepLifecycle {
|
|
39
|
+
phase?: "setup" | "test" | "cleanup";
|
|
40
|
+
always?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface RequestStep extends StepLifecycle {
|
|
43
|
+
name?: string;
|
|
44
|
+
request: {
|
|
45
|
+
method: string;
|
|
46
|
+
params?: unknown;
|
|
47
|
+
};
|
|
48
|
+
assert?: StepAssertion;
|
|
49
|
+
capture?: Record<string, string>;
|
|
50
|
+
export?: Record<string, {
|
|
51
|
+
path: string;
|
|
52
|
+
aggregate?: "single" | "list" | "map";
|
|
53
|
+
sensitive?: boolean;
|
|
54
|
+
}>;
|
|
55
|
+
timeoutMs?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface ToolStep extends StepLifecycle {
|
|
58
|
+
name?: string;
|
|
59
|
+
tool: {
|
|
60
|
+
name: string;
|
|
61
|
+
arguments?: Record<string, unknown>;
|
|
62
|
+
};
|
|
63
|
+
assert?: StepAssertion;
|
|
64
|
+
capture?: Record<string, string>;
|
|
65
|
+
export?: Record<string, {
|
|
66
|
+
path: string;
|
|
67
|
+
aggregate?: "single" | "list" | "map";
|
|
68
|
+
sensitive?: boolean;
|
|
69
|
+
}>;
|
|
70
|
+
timeoutMs?: number;
|
|
71
|
+
}
|
|
72
|
+
export interface UtilityStep extends StepLifecycle {
|
|
73
|
+
name?: string;
|
|
74
|
+
set: {
|
|
75
|
+
variable: string;
|
|
76
|
+
function: string;
|
|
77
|
+
arguments?: Record<string, unknown>;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export interface NativeStep extends StepLifecycle {
|
|
81
|
+
name?: string;
|
|
82
|
+
native: {
|
|
83
|
+
action: "request" | "await-notification" | "subscribe" | "unsubscribe" | "set-log-level" | "list-all" | "task-get" | "task-list" | "task-cancel";
|
|
84
|
+
behavior?: ClientBehavior;
|
|
85
|
+
method?: string;
|
|
86
|
+
params?: unknown;
|
|
87
|
+
uri?: string;
|
|
88
|
+
level?: string;
|
|
89
|
+
field?: string;
|
|
90
|
+
timeoutMs?: number;
|
|
91
|
+
progress?: boolean;
|
|
92
|
+
cancelAfterMs?: number;
|
|
93
|
+
taskId?: string;
|
|
94
|
+
};
|
|
95
|
+
assert?: StepAssertion;
|
|
96
|
+
capture?: Record<string, string>;
|
|
97
|
+
}
|
|
98
|
+
export type TestStep = RequestStep | ToolStep | UtilityStep | NativeStep;
|
|
99
|
+
export interface TestCase {
|
|
100
|
+
name: string;
|
|
101
|
+
id?: string;
|
|
102
|
+
logicalName?: string;
|
|
103
|
+
skip?: boolean | string;
|
|
104
|
+
requires?: {
|
|
105
|
+
capabilities?: string[];
|
|
106
|
+
protocolVersions?: string[];
|
|
107
|
+
};
|
|
108
|
+
dependsOn?: string[];
|
|
109
|
+
variables?: Record<string, unknown>;
|
|
110
|
+
data?: {
|
|
111
|
+
source: string;
|
|
112
|
+
row: number;
|
|
113
|
+
id: string;
|
|
114
|
+
fingerprint: string;
|
|
115
|
+
};
|
|
116
|
+
steps: TestStep[];
|
|
117
|
+
}
|
|
118
|
+
export interface Suite {
|
|
119
|
+
version: 1;
|
|
120
|
+
name?: string;
|
|
121
|
+
target: Target;
|
|
122
|
+
targets?: Record<string, Target>;
|
|
123
|
+
defaults?: {
|
|
124
|
+
timeoutMs?: number;
|
|
125
|
+
};
|
|
126
|
+
redact?: string[];
|
|
127
|
+
extensions?: {
|
|
128
|
+
functions?: string[];
|
|
129
|
+
permissions?: Array<"environment" | "filesystem-read" | "network">;
|
|
130
|
+
allowlist?: string[];
|
|
131
|
+
unsafeLegacy?: boolean;
|
|
132
|
+
};
|
|
133
|
+
client?: ClientBehavior;
|
|
134
|
+
snapshots?: {
|
|
135
|
+
file?: string;
|
|
136
|
+
ignore?: string[];
|
|
137
|
+
};
|
|
138
|
+
tests: TestCase[];
|
|
139
|
+
}
|
|
140
|
+
export interface StepResult {
|
|
141
|
+
name: string;
|
|
142
|
+
method: string;
|
|
143
|
+
status: "passed" | "failed";
|
|
144
|
+
durationMs: number;
|
|
145
|
+
request?: unknown;
|
|
146
|
+
response?: unknown;
|
|
147
|
+
error?: string;
|
|
148
|
+
}
|
|
149
|
+
export interface TestResult {
|
|
150
|
+
name: string;
|
|
151
|
+
id?: string;
|
|
152
|
+
status: "passed" | "failed" | "skipped" | "blocked";
|
|
153
|
+
durationMs: number;
|
|
154
|
+
steps: StepResult[];
|
|
155
|
+
outputs?: Record<string, unknown>;
|
|
156
|
+
error?: string;
|
|
157
|
+
}
|
|
158
|
+
export interface ServerEvidence {
|
|
159
|
+
name?: string;
|
|
160
|
+
version?: string;
|
|
161
|
+
capabilities?: unknown;
|
|
162
|
+
}
|
|
163
|
+
export interface RunResult {
|
|
164
|
+
schemaVersion: 1;
|
|
165
|
+
suiteName: string;
|
|
166
|
+
status: "passed" | "failed";
|
|
167
|
+
startedAt: string;
|
|
168
|
+
durationMs: number;
|
|
169
|
+
protocolVersions: string[];
|
|
170
|
+
server?: ServerEvidence;
|
|
171
|
+
evidenceHash: string;
|
|
172
|
+
tests: TestResult[];
|
|
173
|
+
outputs: Record<string, unknown>;
|
|
174
|
+
summary: {
|
|
175
|
+
passed: number;
|
|
176
|
+
failed: number;
|
|
177
|
+
skipped: number;
|
|
178
|
+
blocked: number;
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export interface SessionInfo {
|
|
182
|
+
protocolVersion?: string;
|
|
183
|
+
serverName?: string;
|
|
184
|
+
serverVersion?: string;
|
|
185
|
+
capabilities?: Record<string, unknown>;
|
|
186
|
+
}
|
|
187
|
+
export interface NativeEvent {
|
|
188
|
+
method: string;
|
|
189
|
+
params?: unknown;
|
|
190
|
+
sequence: number;
|
|
191
|
+
}
|
|
192
|
+
export interface NativeRequestOptions {
|
|
193
|
+
timeoutMs?: number;
|
|
194
|
+
progress?: boolean;
|
|
195
|
+
cancelAfterMs?: number;
|
|
196
|
+
task?: boolean;
|
|
197
|
+
}
|
|
198
|
+
export interface NativeRequestResult {
|
|
199
|
+
result: unknown;
|
|
200
|
+
progress: unknown[];
|
|
201
|
+
taskEvents: unknown[];
|
|
202
|
+
}
|
|
203
|
+
export interface ClientBehavior {
|
|
204
|
+
roots?: Array<{
|
|
205
|
+
uri: string;
|
|
206
|
+
name?: string;
|
|
207
|
+
}>;
|
|
208
|
+
sampling?: {
|
|
209
|
+
model: string;
|
|
210
|
+
text: string;
|
|
211
|
+
};
|
|
212
|
+
elicitation?: {
|
|
213
|
+
action: "accept" | "decline" | "cancel";
|
|
214
|
+
content?: Record<string, string | number | boolean | string[]>;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
export interface TestSession {
|
|
218
|
+
connect(): Promise<SessionInfo>;
|
|
219
|
+
request(method: string, params?: unknown, timeoutMs?: number): Promise<unknown>;
|
|
220
|
+
nativeRequest?(method: string, params?: unknown, options?: NativeRequestOptions): Promise<NativeRequestResult>;
|
|
221
|
+
events?(): NativeEvent[];
|
|
222
|
+
awaitEvent?(method: string, timeoutMs?: number): Promise<NativeEvent>;
|
|
223
|
+
subscribe?(uri: string): Promise<unknown>;
|
|
224
|
+
unsubscribe?(uri: string): Promise<unknown>;
|
|
225
|
+
setLoggingLevel?(level: string): Promise<unknown>;
|
|
226
|
+
configureClient?(behavior: ClientBehavior): void;
|
|
227
|
+
close(): Promise<void>;
|
|
228
|
+
diagnostics(): string[];
|
|
229
|
+
}
|
|
230
|
+
export interface DiscoveryDocument {
|
|
231
|
+
schemaVersion: 1;
|
|
232
|
+
discoveredAt: string;
|
|
233
|
+
target: {
|
|
234
|
+
transport: Target["transport"];
|
|
235
|
+
};
|
|
236
|
+
server: ServerEvidence;
|
|
237
|
+
protocolVersion?: string;
|
|
238
|
+
tools: unknown[];
|
|
239
|
+
resources: unknown[];
|
|
240
|
+
resourceTemplates: unknown[];
|
|
241
|
+
prompts: unknown[];
|
|
242
|
+
fingerprint: string;
|
|
243
|
+
diagnostics: string[];
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAIjF,wBAAsB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAuBrH"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { mkdir, readFile, readdir, realpath, rename, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, extname, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { loadTestFile } from "./qa-loader.js";
|
|
6
|
+
import { parityReport, runParity } from "./parity.js";
|
|
7
|
+
import { terminalReport } from "./reporters.js";
|
|
8
|
+
import { runSuite } from "./runner.js";
|
|
9
|
+
const TEXT_EXTENSIONS = new Set([".mcpr", ".yaml", ".yml", ".json", ".csv"]);
|
|
10
|
+
export async function startWorkspace(options = {}) {
|
|
11
|
+
const root = await realpath(resolve(options.root ?? process.cwd()));
|
|
12
|
+
const host = options.host ?? "127.0.0.1";
|
|
13
|
+
if (!["127.0.0.1", "localhost", "::1"].includes(host))
|
|
14
|
+
throw new Error("MCP-WEB-001 QA workspace binds only to loopback addresses");
|
|
15
|
+
const csrf = randomBytes(32).toString("base64url");
|
|
16
|
+
const runs = new Map();
|
|
17
|
+
const assets = resolve(dirname(new URL(import.meta.url).pathname), "../workspace-assets");
|
|
18
|
+
const server = createServer(async (req, res) => { securityHeaders(res); try {
|
|
19
|
+
await route(req, res);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
json(res, 500, { error: { code: "MCP-WEB-500", message: error instanceof Error ? error.message : String(error) } });
|
|
23
|
+
} });
|
|
24
|
+
async function route(req, res) {
|
|
25
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
|
|
26
|
+
const method = req.method ?? "GET";
|
|
27
|
+
if (method !== "GET" && !authorized(req, csrf, `http://${req.headers.host}`))
|
|
28
|
+
return json(res, 403, { error: { code: "MCP-WEB-403", message: "Invalid workspace origin or CSRF token" } });
|
|
29
|
+
if (url.pathname === "/" || url.pathname === "/app.js" || url.pathname === "/style.css")
|
|
30
|
+
return asset(res, join(assets, url.pathname === "/" ? "index.html" : url.pathname.slice(1)));
|
|
31
|
+
if (url.pathname === "/api/v1/bootstrap")
|
|
32
|
+
return json(res, 200, { version: "1.0.0-rc.1", root: basename(root), csrf, capabilities: ["edit", "validate", "test", "parity", "evidence", "snapshots", "contracts"] });
|
|
33
|
+
if (url.pathname === "/api/v1/suites" && method === "GET")
|
|
34
|
+
return json(res, 200, { suites: await suites(root) });
|
|
35
|
+
if (url.pathname === "/api/v1/file" && method === "GET") {
|
|
36
|
+
const path = safePath(root, url.searchParams.get("path") ?? "");
|
|
37
|
+
const text = await limitedRead(path);
|
|
38
|
+
return json(res, 200, { path: relative(root, path), text, etag: etag(text) });
|
|
39
|
+
}
|
|
40
|
+
if (url.pathname === "/api/v1/file" && method === "PUT") {
|
|
41
|
+
const body = await bodyJson(req);
|
|
42
|
+
const path = safePath(root, body.path);
|
|
43
|
+
const current = await readFile(path, "utf8").catch(() => "");
|
|
44
|
+
if (body.etag && body.etag !== etag(current))
|
|
45
|
+
return json(res, 412, { error: { code: "MCP-WEB-412", message: "File changed since it was opened" } });
|
|
46
|
+
if (typeof body.text !== "string" || Buffer.byteLength(body.text) > 1024 * 1024)
|
|
47
|
+
return json(res, 400, { error: { code: "MCP-WEB-400", message: "Text must be under 1 MiB" } });
|
|
48
|
+
await atomicWrite(path, body.text);
|
|
49
|
+
return json(res, 200, { etag: etag(body.text) });
|
|
50
|
+
}
|
|
51
|
+
if (url.pathname === "/api/v1/validate" && method === "POST") {
|
|
52
|
+
const body = await bodyJson(req);
|
|
53
|
+
const path = safePath(root, body.path);
|
|
54
|
+
try {
|
|
55
|
+
const suite = await loadTestFile(path);
|
|
56
|
+
return json(res, 200, { valid: true, suite: { name: suite.name, tests: suite.tests.length, parityTargets: Object.keys(suite.targets ?? {}) } });
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return json(res, 200, { valid: false, diagnostics: [{ severity: "error", message: error instanceof Error ? error.message : String(error) }] });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (url.pathname === "/api/v1/runs" && method === "POST") {
|
|
63
|
+
const body = await bodyJson(req);
|
|
64
|
+
if (!body || !["test", "parity"].includes(body.mode) || typeof body.path !== "string" || Object.keys(body).some((key) => !["path", "mode"].includes(key)))
|
|
65
|
+
return json(res, 400, { error: { code: "MCP-WEB-400", message: "Run accepts only saved path and test/parity mode" } });
|
|
66
|
+
const path = safePath(root, body.path);
|
|
67
|
+
const id = randomBytes(12).toString("hex");
|
|
68
|
+
const run = { id, suite: relative(root, path), mode: body.mode, status: "running", output: "Starting…" };
|
|
69
|
+
runs.set(id, run);
|
|
70
|
+
void execute(run, path);
|
|
71
|
+
return json(res, 202, { runId: id });
|
|
72
|
+
}
|
|
73
|
+
const runMatch = url.pathname.match(/^\/api\/v1\/runs\/([a-f0-9]+)$/);
|
|
74
|
+
if (runMatch && method === "GET") {
|
|
75
|
+
const run = runs.get(runMatch[1]);
|
|
76
|
+
return run ? json(res, 200, run) : json(res, 404, { error: { code: "MCP-WEB-404", message: "Run not found" } });
|
|
77
|
+
}
|
|
78
|
+
if (url.pathname === "/api/v1/evidence" && method === "GET")
|
|
79
|
+
return json(res, 200, { entries: await directoryEntries(join(root, ".mcprigor")) });
|
|
80
|
+
return json(res, 404, { error: { code: "MCP-WEB-404", message: "Not found" } });
|
|
81
|
+
}
|
|
82
|
+
async function execute(run, path) { try {
|
|
83
|
+
const suite = await loadTestFile(path);
|
|
84
|
+
if (run.mode === "parity") {
|
|
85
|
+
if (!suite.targets)
|
|
86
|
+
throw new Error("This suite has no Compare target declarations");
|
|
87
|
+
const result = await runParity(suite, suite.targets, { cwd: root });
|
|
88
|
+
run.result = result;
|
|
89
|
+
run.output = parityReport(result);
|
|
90
|
+
run.status = result.status;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const result = await runSuite(suite, { cwd: root });
|
|
94
|
+
run.result = result;
|
|
95
|
+
run.output = terminalReport(result);
|
|
96
|
+
run.status = result.status;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
run.status = "failed";
|
|
101
|
+
run.error = error instanceof Error ? error.message : String(error);
|
|
102
|
+
run.output = run.error;
|
|
103
|
+
} }
|
|
104
|
+
await new Promise((resolveListen, reject) => { server.once("error", reject); server.listen(options.port ?? 0, host, () => resolveListen()); });
|
|
105
|
+
const address = server.address();
|
|
106
|
+
const port = typeof address === "object" && address ? address.port : options.port;
|
|
107
|
+
return { url: `http://${host}:${port}`, close: () => new Promise((resolveClose, reject) => server.close((error) => error ? reject(error) : resolveClose())) };
|
|
108
|
+
}
|
|
109
|
+
async function suites(root) { const files = []; async function walk(dir) { for (const item of await readdir(dir, { withFileTypes: true })) {
|
|
110
|
+
if (["node_modules", ".git", "dist"].includes(item.name))
|
|
111
|
+
continue;
|
|
112
|
+
const full = join(dir, item.name);
|
|
113
|
+
if (item.isDirectory())
|
|
114
|
+
await walk(full);
|
|
115
|
+
else if ([".mcpr", ".yaml", ".yml", ".json"].includes(extname(item.name)))
|
|
116
|
+
files.push(relative(root, full));
|
|
117
|
+
if (files.length >= 200)
|
|
118
|
+
return;
|
|
119
|
+
} } await walk(root); return files.sort().map((path) => ({ path, name: basename(path) })); }
|
|
120
|
+
function safePath(root, input) { if (!input || input.includes("\0") || input.includes("\\") || input.startsWith("/") || /^[A-Za-z]:/.test(input))
|
|
121
|
+
throw new Error("MCP-WEB-002 Invalid workspace path"); const output = resolve(root, input); if (output !== root && !output.startsWith(root + sep))
|
|
122
|
+
throw new Error("MCP-WEB-003 Path leaves workspace"); if (!TEXT_EXTENSIONS.has(extname(output)))
|
|
123
|
+
throw new Error("MCP-WEB-004 Unsupported file type"); return output; }
|
|
124
|
+
async function limitedRead(path) { const info = await stat(path); if (info.size > 1024 * 1024)
|
|
125
|
+
throw new Error("MCP-WEB-005 File exceeds 1 MiB"); return readFile(path, "utf8"); }
|
|
126
|
+
async function atomicWrite(path, text) { await mkdir(dirname(path), { recursive: true }); const temp = `${path}.${randomBytes(6).toString("hex")}.tmp`; await writeFile(temp, text, { mode: 0o600 }); await rename(temp, path); }
|
|
127
|
+
async function directoryEntries(path) { try {
|
|
128
|
+
return (await readdir(path)).slice(0, 200);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return [];
|
|
132
|
+
} }
|
|
133
|
+
function etag(text) { return `sha256:${createHash("sha256").update(text).digest("hex")}`; }
|
|
134
|
+
function authorized(req, token, origin) { const supplied = String(req.headers["x-mcp-csrf"] ?? ""); return req.headers.origin === origin && supplied.length === token.length && timingSafeEqual(Buffer.from(supplied), Buffer.from(token)); }
|
|
135
|
+
async function bodyJson(req) { const chunks = []; let size = 0; for await (const chunk of req) {
|
|
136
|
+
size += chunk.length;
|
|
137
|
+
if (size > 1024 * 1024)
|
|
138
|
+
throw new Error("Request body exceeds 1 MiB");
|
|
139
|
+
chunks.push(chunk);
|
|
140
|
+
} return JSON.parse(Buffer.concat(chunks).toString("utf8")); }
|
|
141
|
+
function securityHeaders(res) { res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self'; style-src 'self'; connect-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'none'; frame-ancestors 'none'"); res.setHeader("X-Content-Type-Options", "nosniff"); res.setHeader("Referrer-Policy", "no-referrer"); res.setHeader("Cache-Control", "no-store"); }
|
|
142
|
+
async function asset(res, path) { const content = await readFile(path); res.statusCode = 200; res.setHeader("Content-Type", extname(path) === ".js" ? "text/javascript; charset=utf-8" : extname(path) === ".css" ? "text/css; charset=utf-8" : "text/html; charset=utf-8"); res.end(content); }
|
|
143
|
+
function json(res, status, value) { res.statusCode = status; res.setHeader("Content-Type", "application/json; charset=utf-8"); res.end(JSON.stringify(value)); }
|
|
144
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# CLI reference
|
|
2
|
+
|
|
3
|
+
Use `npx mcprigor` when installed locally. Examples below use `mcprigor` for brevity.
|
|
4
|
+
|
|
5
|
+
## Create and author tests
|
|
6
|
+
|
|
7
|
+
### `init`
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
mcprigor init tests/acceptance.mcpr
|
|
11
|
+
mcprigor init tests/acceptance.mcpr --force
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Creates an editable plain-language example. Existing files are protected unless `--force` is supplied.
|
|
15
|
+
|
|
16
|
+
### `author`
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
mcprigor author server.mcpr --out tests/customer.mcpr
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Connects to the target in `server.mcpr` and guides you through creating a test.
|
|
23
|
+
|
|
24
|
+
## Validate and run
|
|
25
|
+
|
|
26
|
+
### `check`
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
mcprigor check tests/acceptance.mcpr
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Validates language and configuration without connecting to the server. Alias: `validate`.
|
|
33
|
+
|
|
34
|
+
### `test`
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
mcprigor test tests/acceptance.mcpr
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Aliases: `run`, for YAML/JSON compatibility.
|
|
41
|
+
|
|
42
|
+
Common options:
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
--test "pattern*" Run matching tests
|
|
46
|
+
--html report.html Write a readable HTML report
|
|
47
|
+
--json result.json Write structured JSON
|
|
48
|
+
--junit result.xml Write JUnit XML
|
|
49
|
+
--evidence DIRECTORY Save a sanitized evidence bundle
|
|
50
|
+
--snapshot FILE Verify semantic snapshots
|
|
51
|
+
--update-snapshots Explicitly create/update snapshots
|
|
52
|
+
--state-in FILE Load persisted successful outputs
|
|
53
|
+
--state-out FILE Save successful exported outputs
|
|
54
|
+
--max-rows NUMBER Limit expanded data rows
|
|
55
|
+
--allow-remote-data Enable REST and Google Sheets data
|
|
56
|
+
--allow-custom-code Enable reviewed isolated extensions
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Example CI run:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
mcprigor test tests/acceptance.mcpr \
|
|
63
|
+
--junit reports/mcp.xml \
|
|
64
|
+
--evidence .mcprigor/ci-run
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Browser workspace
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
mcprigor workspace
|
|
71
|
+
mcprigor workspace ./acceptance-tests
|
|
72
|
+
mcprigor workspace ./acceptance-tests --port 4173
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Starts a loopback-only QA interface. Alias: `web`.
|
|
76
|
+
|
|
77
|
+
## Transport parity
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
mcprigor parity tests/parity.mcpr
|
|
81
|
+
mcprigor parity tests/parity.mcpr --markdown
|
|
82
|
+
mcprigor parity tests/parity.mcpr --markdown --out parity.md
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The suite must contain at least two `Compare target` declarations.
|
|
86
|
+
|
|
87
|
+
## Discovery and contracts
|
|
88
|
+
|
|
89
|
+
### Discover
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
mcprigor discover server.mcpr --out mcp.lock.yaml
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Saves the server identity, capabilities, tools, resources, prompts, and fingerprint.
|
|
96
|
+
|
|
97
|
+
### Generate contract tests
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
mcprigor generate mcp.lock.yaml --target server.mcpr --out generated.yaml
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Check drift
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
mcprigor contract-check mcp.lock.yaml --target server.mcpr
|
|
107
|
+
mcprigor contract-check mcp.lock.yaml --target server.mcpr --markdown --out drift.md
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Returns `1` when breaking drift exists.
|
|
111
|
+
|
|
112
|
+
### Compare locks
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
mcprigor contract-diff old.lock.yaml new.lock.yaml
|
|
116
|
+
mcprigor contract-diff old.lock.yaml new.lock.yaml --markdown
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Update a lock
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
mcprigor contract-update mcp.lock.yaml --target server.mcpr
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Review the printed changes before committing the updated lock.
|
|
126
|
+
|
|
127
|
+
## Evidence
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
mcprigor evidence-show .mcprigor/run-001
|
|
131
|
+
mcprigor evidence-compare .mcprigor/run-001 .mcprigor/run-002
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Snapshots and replay
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
mcprigor snapshot-diff old.json new.json
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
mcprigor replay .mcprigor/run-001/trace.normalized.jsonl \
|
|
142
|
+
--target server.mcpr
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Tool calls are denied during replay unless explicitly approved:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
mcprigor replay trace.normalized.jsonl \
|
|
149
|
+
--target server.mcpr \
|
|
150
|
+
--allow-tool find_customer
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`--allow-tool` may be repeated.
|
|
154
|
+
|
|
155
|
+
## Exit codes
|
|
156
|
+
|
|
157
|
+
| Code | Meaning |
|
|
158
|
+
|---:|---|
|
|
159
|
+
| `0` | Success |
|
|
160
|
+
| `1` | Test, snapshot, parity, replay, or breaking-drift failure |
|
|
161
|
+
| `2` | Invalid usage, language, or configuration |
|
|
162
|
+
| `3` | Server, transport, extension, or internal failure |
|
|
163
|
+
| `130` | Interrupted by the user |
|
|
164
|
+
|
|
165
|
+
## Safety flags
|
|
166
|
+
|
|
167
|
+
`--allow-remote-data` and `--allow-custom-code` are intentionally explicit. Do not add them automatically in shared scripts. Review the source and required permissions first.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Compatibility Policy
|
|
2
|
+
|
|
3
|
+
## Required release matrix
|
|
4
|
+
|
|
5
|
+
| Axis | Supported |
|
|
6
|
+
|---|---|
|
|
7
|
+
| Node.js | 20, 22 |
|
|
8
|
+
| Operating systems | Linux, macOS, Windows |
|
|
9
|
+
| MCP revisions | `2024-11-05`, `2025-03-26`, `2025-06-18` |
|
|
10
|
+
| Transports | stdio, Streamable HTTP |
|
|
11
|
+
| Fixtures | known-good server and intentionally broken startup servers |
|
|
12
|
+
|
|
13
|
+
Pull requests run the full test suite on Node 20/22 across Ubuntu, macOS, and Windows. A dedicated Linux compatibility job runs each advertised protocol revision against both transport models. Security and lifecycle fixtures run separately and production dependencies are audited.
|
|
14
|
+
|
|
15
|
+
The protocol matrix verifies gating, capability handling, and normalized runtime behavior. Real transport integration is covered by the known-good stdio fixture and existing Streamable HTTP SDK tests; parity behavior is tested independently.
|
|
16
|
+
|
|
17
|
+
## Broken fixture coverage
|
|
18
|
+
|
|
19
|
+
- missing executable;
|
|
20
|
+
- process exits before initialization;
|
|
21
|
+
- initialization timeout/error classification;
|
|
22
|
+
- idempotent cleanup and parallel session registry;
|
|
23
|
+
- invalid/hostile YAML and CSV;
|
|
24
|
+
- remote private-network URLs;
|
|
25
|
+
- encoded credentials and terminal control sequences.
|
|
26
|
+
|
|
27
|
+
## Third-party servers
|
|
28
|
+
|
|
29
|
+
Third-party compatibility should be pinned and reproducible, never a required CI dependency on a live public endpoint. Recommended release candidates:
|
|
30
|
+
|
|
31
|
+
1. Pin a tagged server revision in a container or fixture lock.
|
|
32
|
+
2. Run discovery, generated contract smoke tests, one domain scenario, and shutdown.
|
|
33
|
+
3. Record the server name/version, SDK version, transport, protocol revision, and expected fingerprint.
|
|
34
|
+
4. Keep “latest” dependency/server jobs advisory until triaged; supported pinned failures block release.
|
|
35
|
+
|
|
36
|
+
No third-party server is currently claimed as certified. Compatibility results demonstrate tested behavior only.
|
|
37
|
+
|
|
38
|
+
## Process lifecycle guarantees
|
|
39
|
+
|
|
40
|
+
MCP Rigor tracks active sessions, installs SIGINT/SIGTERM cleanup in the CLI, closes clients/transports on initialization errors, and makes global shutdown idempotent. The pinned SDK escalates direct stdio children from stdin close to TERM and KILL.
|
|
41
|
+
|
|
42
|
+
Strict grandchild containment is platform-specific: POSIX process groups and Windows Job Objects are the desired final guarantee. The current SDK owns the direct child, so servers that spawn descendants must also implement responsible descendant shutdown. Release tests should continue to treat surviving descendants as a blocker.
|