milieu-cli 0.1.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 +200 -0
- package/README.md +153 -0
- package/dist/bridges/index.d.ts +5 -0
- package/dist/bridges/index.d.ts.map +1 -0
- package/dist/bridges/index.js +6 -0
- package/dist/bridges/index.js.map +1 -0
- package/dist/bridges/reachability/crawler-policy.d.ts +36 -0
- package/dist/bridges/reachability/crawler-policy.d.ts.map +1 -0
- package/dist/bridges/reachability/crawler-policy.js +110 -0
- package/dist/bridges/reachability/crawler-policy.js.map +1 -0
- package/dist/bridges/reachability/http-status.d.ts +7 -0
- package/dist/bridges/reachability/http-status.d.ts.map +1 -0
- package/dist/bridges/reachability/http-status.js +74 -0
- package/dist/bridges/reachability/http-status.js.map +1 -0
- package/dist/bridges/reachability/https-check.d.ts +14 -0
- package/dist/bridges/reachability/https-check.d.ts.map +1 -0
- package/dist/bridges/reachability/https-check.js +38 -0
- package/dist/bridges/reachability/https-check.js.map +1 -0
- package/dist/bridges/reachability/index.d.ts +13 -0
- package/dist/bridges/reachability/index.d.ts.map +1 -0
- package/dist/bridges/reachability/index.js +115 -0
- package/dist/bridges/reachability/index.js.map +1 -0
- package/dist/bridges/reachability/meta-robots.d.ts +16 -0
- package/dist/bridges/reachability/meta-robots.d.ts.map +1 -0
- package/dist/bridges/reachability/meta-robots.js +119 -0
- package/dist/bridges/reachability/meta-robots.js.map +1 -0
- package/dist/bridges/reachability/robots-parser.d.ts +26 -0
- package/dist/bridges/reachability/robots-parser.d.ts.map +1 -0
- package/dist/bridges/reachability/robots-parser.js +105 -0
- package/dist/bridges/reachability/robots-parser.js.map +1 -0
- package/dist/bridges/reachability/robots-txt.d.ts +14 -0
- package/dist/bridges/reachability/robots-txt.d.ts.map +1 -0
- package/dist/bridges/reachability/robots-txt.js +80 -0
- package/dist/bridges/reachability/robots-txt.js.map +1 -0
- package/dist/bridges/separation/api-presence.d.ts +14 -0
- package/dist/bridges/separation/api-presence.d.ts.map +1 -0
- package/dist/bridges/separation/api-presence.js +96 -0
- package/dist/bridges/separation/api-presence.js.map +1 -0
- package/dist/bridges/separation/developer-docs.d.ts +21 -0
- package/dist/bridges/separation/developer-docs.d.ts.map +1 -0
- package/dist/bridges/separation/developer-docs.js +81 -0
- package/dist/bridges/separation/developer-docs.js.map +1 -0
- package/dist/bridges/separation/index.d.ts +20 -0
- package/dist/bridges/separation/index.d.ts.map +1 -0
- package/dist/bridges/separation/index.js +63 -0
- package/dist/bridges/separation/index.js.map +1 -0
- package/dist/bridges/separation/sdk-references.d.ts +12 -0
- package/dist/bridges/separation/sdk-references.d.ts.map +1 -0
- package/dist/bridges/separation/sdk-references.js +93 -0
- package/dist/bridges/separation/sdk-references.js.map +1 -0
- package/dist/bridges/separation/webhook-support.d.ts +19 -0
- package/dist/bridges/separation/webhook-support.d.ts.map +1 -0
- package/dist/bridges/separation/webhook-support.js +94 -0
- package/dist/bridges/separation/webhook-support.js.map +1 -0
- package/dist/bridges/standards/index.d.ts +13 -0
- package/dist/bridges/standards/index.d.ts.map +1 -0
- package/dist/bridges/standards/index.js +79 -0
- package/dist/bridges/standards/index.js.map +1 -0
- package/dist/bridges/standards/json-ld.d.ts +16 -0
- package/dist/bridges/standards/json-ld.d.ts.map +1 -0
- package/dist/bridges/standards/json-ld.js +63 -0
- package/dist/bridges/standards/json-ld.js.map +1 -0
- package/dist/bridges/standards/llms-txt.d.ts +19 -0
- package/dist/bridges/standards/llms-txt.d.ts.map +1 -0
- package/dist/bridges/standards/llms-txt.js +64 -0
- package/dist/bridges/standards/llms-txt.js.map +1 -0
- package/dist/bridges/standards/mcp.d.ts +13 -0
- package/dist/bridges/standards/mcp.d.ts.map +1 -0
- package/dist/bridges/standards/mcp.js +72 -0
- package/dist/bridges/standards/mcp.js.map +1 -0
- package/dist/bridges/standards/openapi.d.ts +14 -0
- package/dist/bridges/standards/openapi.d.ts.map +1 -0
- package/dist/bridges/standards/openapi.js +424 -0
- package/dist/bridges/standards/openapi.js.map +1 -0
- package/dist/bridges/standards/schema-org.d.ts +12 -0
- package/dist/bridges/standards/schema-org.d.ts.map +1 -0
- package/dist/bridges/standards/schema-org.js +101 -0
- package/dist/bridges/standards/schema-org.js.map +1 -0
- package/dist/bridges/standards/well-known.d.ts +16 -0
- package/dist/bridges/standards/well-known.d.ts.map +1 -0
- package/dist/bridges/standards/well-known.js +77 -0
- package/dist/bridges/standards/well-known.js.map +1 -0
- package/dist/bridges/stubs.d.ts +4 -0
- package/dist/bridges/stubs.d.ts.map +1 -0
- package/dist/bridges/stubs.js +25 -0
- package/dist/bridges/stubs.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +83 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/explanations.d.ts +11 -0
- package/dist/core/explanations.d.ts.map +1 -0
- package/dist/core/explanations.js +128 -0
- package/dist/core/explanations.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/scan.d.ts +3 -0
- package/dist/core/scan.d.ts.map +1 -0
- package/dist/core/scan.js +89 -0
- package/dist/core/scan.js.map +1 -0
- package/dist/core/types.d.ts +119 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +7 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/render/colors.d.ts +7 -0
- package/dist/render/colors.d.ts.map +1 -0
- package/dist/render/colors.js +28 -0
- package/dist/render/colors.js.map +1 -0
- package/dist/render/format-bridge.d.ts +3 -0
- package/dist/render/format-bridge.d.ts.map +1 -0
- package/dist/render/format-bridge.js +39 -0
- package/dist/render/format-bridge.js.map +1 -0
- package/dist/render/format-scan.d.ts +3 -0
- package/dist/render/format-scan.d.ts.map +1 -0
- package/dist/render/format-scan.js +44 -0
- package/dist/render/format-scan.js.map +1 -0
- package/dist/render/format-verbose.d.ts +3 -0
- package/dist/render/format-verbose.d.ts.map +1 -0
- package/dist/render/format-verbose.js +14 -0
- package/dist/render/format-verbose.js.map +1 -0
- package/dist/render/index.d.ts +7 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +8 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/progress-bar.d.ts +10 -0
- package/dist/render/progress-bar.d.ts.map +1 -0
- package/dist/render/progress-bar.js +21 -0
- package/dist/render/progress-bar.js.map +1 -0
- package/dist/render/symbols.d.ts +10 -0
- package/dist/render/symbols.d.ts.map +1 -0
- package/dist/render/symbols.js +21 -0
- package/dist/render/symbols.js.map +1 -0
- package/dist/utils/http-client.d.ts +25 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +235 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/ssrf.d.ts +29 -0
- package/dist/utils/ssrf.d.ts.map +1 -0
- package/dist/utils/ssrf.js +134 -0
- package/dist/utils/ssrf.js.map +1 -0
- package/dist/utils/url.d.ts +53 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +64 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Check } from "../../core/types.js";
|
|
2
|
+
/** Extracted JSON-LD block with type and context information */
|
|
3
|
+
export interface JsonLdBlock {
|
|
4
|
+
type: string | string[];
|
|
5
|
+
context: unknown;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Extract JSON-LD structured data blocks from HTML.
|
|
9
|
+
*
|
|
10
|
+
* Scans for <script type="application/ld+json"> tags via regex,
|
|
11
|
+
* parses JSON, and collects blocks with @type fields.
|
|
12
|
+
*
|
|
13
|
+
* Pure function -- no HTTP calls. Takes HTML string directly.
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkJsonLd(html: string): Check;
|
|
16
|
+
//# sourceMappingURL=json-ld.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-ld.d.ts","sourceRoot":"","sources":["../../../src/bridges/standards/json-ld.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAUD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAuD/C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flatten a JSON-LD @type value to a display string.
|
|
3
|
+
* If array, join with ", "; if string, return as-is.
|
|
4
|
+
*/
|
|
5
|
+
function typeToString(type) {
|
|
6
|
+
return Array.isArray(type) ? type.join(", ") : type;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extract JSON-LD structured data blocks from HTML.
|
|
10
|
+
*
|
|
11
|
+
* Scans for <script type="application/ld+json"> tags via regex,
|
|
12
|
+
* parses JSON, and collects blocks with @type fields.
|
|
13
|
+
*
|
|
14
|
+
* Pure function -- no HTTP calls. Takes HTML string directly.
|
|
15
|
+
*/
|
|
16
|
+
export function checkJsonLd(html) {
|
|
17
|
+
const id = "json_ld";
|
|
18
|
+
const label = "JSON-LD Structured Data";
|
|
19
|
+
const blocks = [];
|
|
20
|
+
const regex = /<script\s+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi;
|
|
21
|
+
let match;
|
|
22
|
+
while ((match = regex.exec(html)) !== null) {
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(match[1]);
|
|
25
|
+
// Handle both single objects and arrays of objects
|
|
26
|
+
const items = Array.isArray(parsed) ? parsed : [parsed];
|
|
27
|
+
for (const item of items) {
|
|
28
|
+
if (typeof item === "object" &&
|
|
29
|
+
item !== null &&
|
|
30
|
+
"@type" in item) {
|
|
31
|
+
const obj = item;
|
|
32
|
+
blocks.push({
|
|
33
|
+
type: obj["@type"],
|
|
34
|
+
context: obj["@context"] ?? null,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Invalid JSON in script tag -- skip
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (blocks.length === 0) {
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
label,
|
|
47
|
+
status: "fail",
|
|
48
|
+
detail: "No JSON-LD structured data found",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const typesStr = blocks.map((b) => typeToString(b.type)).join(", ");
|
|
52
|
+
const detail = blocks.length === 1
|
|
53
|
+
? `1 JSON-LD block found: ${typesStr}`
|
|
54
|
+
: `${blocks.length} JSON-LD blocks found: ${typesStr}`;
|
|
55
|
+
return {
|
|
56
|
+
id,
|
|
57
|
+
label,
|
|
58
|
+
status: "pass",
|
|
59
|
+
detail,
|
|
60
|
+
data: { blocks },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=json-ld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-ld.js","sourceRoot":"","sources":["../../../src/bridges/standards/json-ld.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAuB;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,EAAE,GAAG,SAAS,CAAC;IACrB,MAAM,KAAK,GAAG,yBAAyB,CAAC;IAExC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GACT,0EAA0E,CAAC;IAE7E,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7C,mDAAmD;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IACE,OAAO,IAAI,KAAK,QAAQ;oBACxB,IAAI,KAAK,IAAI;oBACb,OAAO,IAAK,IAAgC,EAC5C,CAAC;oBACD,MAAM,GAAG,GAAG,IAA+B,CAAC;oBAC5C,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,GAAG,CAAC,OAAO,CAAsB;wBACvC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI;qBACjC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,EAAE;YACF,KAAK;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,kCAAkC;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,CAAC;QACjB,CAAC,CAAC,0BAA0B,QAAQ,EAAE;QACtC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,0BAA0B,QAAQ,EAAE,CAAC;IAE3D,OAAO;QACL,EAAE;QACF,KAAK;QACL,MAAM,EAAE,MAAM;QACd,MAAM;QACN,IAAI,EAAE,EAAE,MAAM,EAAE;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Check } from "../../core/types.js";
|
|
2
|
+
export interface LlmsTxtResult {
|
|
3
|
+
check: Check;
|
|
4
|
+
body: string | null;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Check for llms.txt at the domain root.
|
|
8
|
+
*
|
|
9
|
+
* Per llmstxt.org spec: Markdown format, H1 required as first line.
|
|
10
|
+
* Returns pass if H1 present, partial if file exists but no H1, fail if missing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkLlmsTxt(baseUrl: string, timeout?: number): Promise<LlmsTxtResult>;
|
|
13
|
+
/**
|
|
14
|
+
* Check for llms-full.txt at the domain root.
|
|
15
|
+
*
|
|
16
|
+
* No H1 requirement -- just check for presence and non-empty body.
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkLlmsFullTxt(baseUrl: string, timeout?: number): Promise<Check>;
|
|
19
|
+
//# sourceMappingURL=llms-txt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llms-txt.d.ts","sourceRoot":"","sources":["../../../src/bridges/standards/llms-txt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGjD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAwCxB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,CAAC,CAmBhB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { httpGet } from "../../utils/http-client.js";
|
|
2
|
+
/**
|
|
3
|
+
* Check for llms.txt at the domain root.
|
|
4
|
+
*
|
|
5
|
+
* Per llmstxt.org spec: Markdown format, H1 required as first line.
|
|
6
|
+
* Returns pass if H1 present, partial if file exists but no H1, fail if missing.
|
|
7
|
+
*/
|
|
8
|
+
export async function checkLlmsTxt(baseUrl, timeout) {
|
|
9
|
+
const id = "llms_txt";
|
|
10
|
+
const label = "llms.txt";
|
|
11
|
+
const result = await httpGet(`${baseUrl}/llms.txt`, { timeout });
|
|
12
|
+
if (!result.ok) {
|
|
13
|
+
return { check: { id, label, status: "fail", detail: "No llms.txt found" }, body: null };
|
|
14
|
+
}
|
|
15
|
+
if (result.body.trim().length === 0) {
|
|
16
|
+
return { check: { id, label, status: "fail", detail: "No llms.txt found" }, body: null };
|
|
17
|
+
}
|
|
18
|
+
const sizeBytes = new TextEncoder().encode(result.body).byteLength;
|
|
19
|
+
const firstLine = result.body.trim().split("\n")[0].trim();
|
|
20
|
+
if (/^#\s+\S/.test(firstLine)) {
|
|
21
|
+
return {
|
|
22
|
+
check: {
|
|
23
|
+
id,
|
|
24
|
+
label,
|
|
25
|
+
status: "pass",
|
|
26
|
+
detail: `llms.txt found (${sizeBytes} bytes)`,
|
|
27
|
+
data: { sizeBytes, firstLine },
|
|
28
|
+
},
|
|
29
|
+
body: result.body,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
check: {
|
|
34
|
+
id,
|
|
35
|
+
label,
|
|
36
|
+
status: "partial",
|
|
37
|
+
detail: "llms.txt found but missing H1 header",
|
|
38
|
+
data: { sizeBytes, firstLine },
|
|
39
|
+
},
|
|
40
|
+
body: result.body,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check for llms-full.txt at the domain root.
|
|
45
|
+
*
|
|
46
|
+
* No H1 requirement -- just check for presence and non-empty body.
|
|
47
|
+
*/
|
|
48
|
+
export async function checkLlmsFullTxt(baseUrl, timeout) {
|
|
49
|
+
const id = "llms_full_txt";
|
|
50
|
+
const label = "llms-full.txt";
|
|
51
|
+
const result = await httpGet(`${baseUrl}/llms-full.txt`, { timeout });
|
|
52
|
+
if (!result.ok || result.body.trim().length === 0) {
|
|
53
|
+
return { id, label, status: "fail", detail: "No llms-full.txt found" };
|
|
54
|
+
}
|
|
55
|
+
const sizeBytes = new TextEncoder().encode(result.body).byteLength;
|
|
56
|
+
return {
|
|
57
|
+
id,
|
|
58
|
+
label,
|
|
59
|
+
status: "pass",
|
|
60
|
+
detail: `llms-full.txt found (${sizeBytes} bytes)`,
|
|
61
|
+
data: { sizeBytes },
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=llms-txt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../../../src/bridges/standards/llms-txt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAOrD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,OAAgB;IAEhB,MAAM,EAAE,GAAG,UAAU,CAAC;IACtB,MAAM,KAAK,GAAG,UAAU,CAAC;IAEzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3F,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3F,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3D,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,KAAK,EAAE;gBACL,EAAE;gBACF,KAAK;gBACL,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,mBAAmB,SAAS,SAAS;gBAC7C,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;aAC/B;YACD,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE;YACL,EAAE;YACF,KAAK;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,sCAAsC;YAC9C,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;SAC/B;QACD,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,OAAgB;IAEhB,MAAM,EAAE,GAAG,eAAe,CAAC;IAC3B,MAAM,KAAK,GAAG,eAAe,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAEtE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IAEnE,OAAO;QACL,EAAE;QACF,KAAK;QACL,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,wBAAwB,SAAS,SAAS;QAClD,IAAI,EAAE,EAAE,SAAS,EAAE;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Check } from "../../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Check for MCP endpoint at /.well-known/mcp.json.
|
|
4
|
+
*
|
|
5
|
+
* Validates against:
|
|
6
|
+
* - Server Card format (SEP-1649): serverInfo + transport
|
|
7
|
+
* - Legacy format: mcp_version or mcpServers
|
|
8
|
+
* - MCP primitives: tools, resources, or prompts
|
|
9
|
+
*
|
|
10
|
+
* Spec is still in draft (targeting June 2026), so validation is lenient.
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkMcpEndpoint(baseUrl: string, timeout?: number): Promise<Check>;
|
|
13
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/bridges/standards/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,CAAC,CAkEhB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { httpGet } from "../../utils/http-client.js";
|
|
2
|
+
/**
|
|
3
|
+
* Check for MCP endpoint at /.well-known/mcp.json.
|
|
4
|
+
*
|
|
5
|
+
* Validates against:
|
|
6
|
+
* - Server Card format (SEP-1649): serverInfo + transport
|
|
7
|
+
* - Legacy format: mcp_version or mcpServers
|
|
8
|
+
* - MCP primitives: tools, resources, or prompts
|
|
9
|
+
*
|
|
10
|
+
* Spec is still in draft (targeting June 2026), so validation is lenient.
|
|
11
|
+
*/
|
|
12
|
+
export async function checkMcpEndpoint(baseUrl, timeout) {
|
|
13
|
+
const id = "mcp_endpoint";
|
|
14
|
+
const label = "MCP Endpoint";
|
|
15
|
+
const result = await httpGet(`${baseUrl}/.well-known/mcp.json`, {
|
|
16
|
+
timeout,
|
|
17
|
+
headers: { Accept: "application/json" },
|
|
18
|
+
});
|
|
19
|
+
if (!result.ok) {
|
|
20
|
+
return { id, label, status: "fail", detail: "No MCP endpoint found" };
|
|
21
|
+
}
|
|
22
|
+
let parsed;
|
|
23
|
+
try {
|
|
24
|
+
parsed = JSON.parse(result.body);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { id, label, status: "fail", detail: "No MCP endpoint found" };
|
|
28
|
+
}
|
|
29
|
+
// Server Card format (SEP-1649)
|
|
30
|
+
if (parsed.serverInfo && parsed.transport) {
|
|
31
|
+
const name = parsed.serverInfo.name ?? "unknown";
|
|
32
|
+
const detail = `MCP Server Card: ${name}`;
|
|
33
|
+
return {
|
|
34
|
+
id,
|
|
35
|
+
label,
|
|
36
|
+
status: "pass",
|
|
37
|
+
detail: `MCP endpoint found: ${detail}`,
|
|
38
|
+
data: { detail },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Legacy / alternative format
|
|
42
|
+
if (parsed.mcp_version || parsed.mcpServers) {
|
|
43
|
+
const detail = "MCP configuration detected";
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
label,
|
|
47
|
+
status: "pass",
|
|
48
|
+
detail: `MCP endpoint found: ${detail}`,
|
|
49
|
+
data: { detail },
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// MCP primitives
|
|
53
|
+
if (parsed.tools || parsed.resources || parsed.prompts) {
|
|
54
|
+
const detail = "MCP primitives detected";
|
|
55
|
+
return {
|
|
56
|
+
id,
|
|
57
|
+
label,
|
|
58
|
+
status: "pass",
|
|
59
|
+
detail: `MCP endpoint found: ${detail}`,
|
|
60
|
+
data: { detail },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Valid JSON but no MCP fields
|
|
64
|
+
return {
|
|
65
|
+
id,
|
|
66
|
+
label,
|
|
67
|
+
status: "partial",
|
|
68
|
+
detail: "MCP endpoint found but structure unclear",
|
|
69
|
+
data: { detail: "JSON found but no MCP fields" },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/bridges/standards/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,OAAgB;IAEhB,MAAM,EAAE,GAAG,cAAc,CAAC;IAC1B,MAAM,KAAK,GAAG,cAAc,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,uBAAuB,EAAE;QAC9D,OAAO;QACP,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;KACxC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACxE,CAAC;IAED,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAA4B,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACxE,CAAC;IAED,gCAAgC;IAChC,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,GACP,MAAM,CAAC,UAAsC,CAAC,IAAI,IAAI,SAAS,CAAC;QACnE,MAAM,MAAM,GAAG,oBAAoB,IAAI,EAAE,CAAC;QAC1C,OAAO;YACL,EAAE;YACF,KAAK;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,uBAAuB,MAAM,EAAE;YACvC,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,4BAA4B,CAAC;QAC5C,OAAO;YACL,EAAE;YACF,KAAK;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,uBAAuB,MAAM,EAAE;YACvC,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,yBAAyB,CAAC;QACzC,OAAO;YACL,EAAE;YACF,KAAK;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,uBAAuB,MAAM,EAAE;YACvC,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,OAAO;QACL,EAAE;QACF,KAAK;QACL,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,0CAA0C;QAClD,IAAI,EAAE,EAAE,MAAM,EAAE,8BAA8B,EAAE;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Check } from "../../core/types.js";
|
|
2
|
+
export interface OpenApiResult {
|
|
3
|
+
check: Check;
|
|
4
|
+
detected: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Probe 19 common OpenAPI / Swagger spec paths in parallel, then try
|
|
8
|
+
* extracting spec URLs from HTML doc pages, and finally detect protected specs.
|
|
9
|
+
*
|
|
10
|
+
* Returns a Check with id "openapi_spec" and a boolean indicating whether
|
|
11
|
+
* any valid spec was detected (for ctx.shared.openApiDetected).
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkOpenApi(baseUrl: string, timeout?: number): Promise<OpenApiResult>;
|
|
14
|
+
//# sourceMappingURL=openapi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../../src/bridges/standards/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,qBAAqB,CAAC;AAO5E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAiQD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAyNxB"}
|