@keak/webmcp-core 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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/dist/config.d.ts +103 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +54 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/exporter/manifest.d.ts +6 -0
  8. package/dist/exporter/manifest.d.ts.map +1 -0
  9. package/dist/exporter/manifest.js +36 -0
  10. package/dist/exporter/manifest.js.map +1 -0
  11. package/dist/exporter/snippet.d.ts +7 -0
  12. package/dist/exporter/snippet.d.ts.map +1 -0
  13. package/dist/exporter/snippet.js +197 -0
  14. package/dist/exporter/snippet.js.map +1 -0
  15. package/dist/exporter/userscript.d.ts +6 -0
  16. package/dist/exporter/userscript.d.ts.map +1 -0
  17. package/dist/exporter/userscript.js +53 -0
  18. package/dist/exporter/userscript.js.map +1 -0
  19. package/dist/exporter/yaml.d.ts +6 -0
  20. package/dist/exporter/yaml.d.ts.map +1 -0
  21. package/dist/exporter/yaml.js +90 -0
  22. package/dist/exporter/yaml.js.map +1 -0
  23. package/dist/extractor/api-extractor.d.ts +3 -0
  24. package/dist/extractor/api-extractor.d.ts.map +1 -0
  25. package/dist/extractor/api-extractor.js +274 -0
  26. package/dist/extractor/api-extractor.js.map +1 -0
  27. package/dist/extractor/click-extractor.d.ts +3 -0
  28. package/dist/extractor/click-extractor.d.ts.map +1 -0
  29. package/dist/extractor/click-extractor.js +52 -0
  30. package/dist/extractor/click-extractor.js.map +1 -0
  31. package/dist/extractor/form-extractor.d.ts +3 -0
  32. package/dist/extractor/form-extractor.d.ts.map +1 -0
  33. package/dist/extractor/form-extractor.js +27 -0
  34. package/dist/extractor/form-extractor.js.map +1 -0
  35. package/dist/extractor/route-extractor.d.ts +3 -0
  36. package/dist/extractor/route-extractor.d.ts.map +1 -0
  37. package/dist/extractor/route-extractor.js +84 -0
  38. package/dist/extractor/route-extractor.js.map +1 -0
  39. package/dist/extractor/schema-inferrer.d.ts +4 -0
  40. package/dist/extractor/schema-inferrer.d.ts.map +1 -0
  41. package/dist/extractor/schema-inferrer.js +128 -0
  42. package/dist/extractor/schema-inferrer.js.map +1 -0
  43. package/dist/index.d.ts +88 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +170 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/linter/linter.d.ts +10 -0
  48. package/dist/linter/linter.d.ts.map +1 -0
  49. package/dist/linter/linter.js +39 -0
  50. package/dist/linter/linter.js.map +1 -0
  51. package/dist/linter/rules.d.ts +4 -0
  52. package/dist/linter/rules.d.ts.map +1 -0
  53. package/dist/linter/rules.js +111 -0
  54. package/dist/linter/rules.js.map +1 -0
  55. package/dist/scanner/browser.d.ts +14 -0
  56. package/dist/scanner/browser.d.ts.map +1 -0
  57. package/dist/scanner/browser.js +42 -0
  58. package/dist/scanner/browser.js.map +1 -0
  59. package/dist/scanner/crawler.d.ts +12 -0
  60. package/dist/scanner/crawler.d.ts.map +1 -0
  61. package/dist/scanner/crawler.js +80 -0
  62. package/dist/scanner/crawler.js.map +1 -0
  63. package/dist/scanner/dom-capture.d.ts +4 -0
  64. package/dist/scanner/dom-capture.d.ts.map +1 -0
  65. package/dist/scanner/dom-capture.js +148 -0
  66. package/dist/scanner/dom-capture.js.map +1 -0
  67. package/dist/scanner/network-capture.d.ts +8 -0
  68. package/dist/scanner/network-capture.d.ts.map +1 -0
  69. package/dist/scanner/network-capture.js +112 -0
  70. package/dist/scanner/network-capture.js.map +1 -0
  71. package/dist/scanner/screenshot.d.ts +3 -0
  72. package/dist/scanner/screenshot.d.ts.map +1 -0
  73. package/dist/scanner/screenshot.js +10 -0
  74. package/dist/scanner/screenshot.js.map +1 -0
  75. package/dist/synthesizer/clusterer.d.ts +7 -0
  76. package/dist/synthesizer/clusterer.d.ts.map +1 -0
  77. package/dist/synthesizer/clusterer.js +310 -0
  78. package/dist/synthesizer/clusterer.js.map +1 -0
  79. package/dist/synthesizer/describer.d.ts +3 -0
  80. package/dist/synthesizer/describer.d.ts.map +1 -0
  81. package/dist/synthesizer/describer.js +92 -0
  82. package/dist/synthesizer/describer.js.map +1 -0
  83. package/dist/synthesizer/llm-client.d.ts +7 -0
  84. package/dist/synthesizer/llm-client.d.ts.map +1 -0
  85. package/dist/synthesizer/llm-client.js +7 -0
  86. package/dist/synthesizer/llm-client.js.map +1 -0
  87. package/dist/synthesizer/namer.d.ts +3 -0
  88. package/dist/synthesizer/namer.d.ts.map +1 -0
  89. package/dist/synthesizer/namer.js +154 -0
  90. package/dist/synthesizer/namer.js.map +1 -0
  91. package/dist/synthesizer/safety-classifier.d.ts +3 -0
  92. package/dist/synthesizer/safety-classifier.d.ts.map +1 -0
  93. package/dist/synthesizer/safety-classifier.js +68 -0
  94. package/dist/synthesizer/safety-classifier.js.map +1 -0
  95. package/dist/synthesizer/schema-builder.d.ts +3 -0
  96. package/dist/synthesizer/schema-builder.d.ts.map +1 -0
  97. package/dist/synthesizer/schema-builder.js +99 -0
  98. package/dist/synthesizer/schema-builder.js.map +1 -0
  99. package/dist/types.d.ts +271 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +3 -0
  102. package/dist/types.js.map +1 -0
  103. package/dist/utils/redact.d.ts +3 -0
  104. package/dist/utils/redact.d.ts.map +1 -0
  105. package/dist/utils/redact.js +42 -0
  106. package/dist/utils/redact.js.map +1 -0
  107. package/dist/utils/validation.d.ts +876 -0
  108. package/dist/utils/validation.d.ts.map +1 -0
  109. package/dist/utils/validation.js +108 -0
  110. package/dist/utils/validation.js.map +1 -0
  111. package/package.json +69 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-extractor.js","sourceRoot":"","sources":["../../src/extractor/route-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { FieldSpec, JsonSchema } from "../types.js";
2
+ export declare function schemaFromFields(fields: FieldSpec[]): JsonSchema;
3
+ export declare function schemaFromSample(sample: unknown): JsonSchema;
4
+ //# sourceMappingURL=schema-inferrer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-inferrer.d.ts","sourceRoot":"","sources":["../../src/extractor/schema-inferrer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAEtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAsEhE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAyC5D"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schemaFromFields = schemaFromFields;
4
+ exports.schemaFromSample = schemaFromSample;
5
+ function schemaFromFields(fields) {
6
+ const properties = {};
7
+ const required = [];
8
+ for (const field of fields) {
9
+ const prop = {};
10
+ switch (field.type) {
11
+ case "string":
12
+ prop.type = "string";
13
+ break;
14
+ case "number":
15
+ prop.type = "number";
16
+ if (field.min !== undefined)
17
+ prop.minimum = field.min;
18
+ if (field.max !== undefined)
19
+ prop.maximum = field.max;
20
+ break;
21
+ case "boolean":
22
+ prop.type = "boolean";
23
+ break;
24
+ case "enum":
25
+ prop.type = "string";
26
+ if (field.options && field.options.length > 0) {
27
+ prop.enum = field.options;
28
+ }
29
+ break;
30
+ case "email":
31
+ prop.type = "string";
32
+ prop.format = "email";
33
+ break;
34
+ case "date":
35
+ prop.type = "string";
36
+ prop.description = "Date in YYYY-MM-DD format";
37
+ break;
38
+ case "tel":
39
+ prop.type = "string";
40
+ break;
41
+ case "url":
42
+ prop.type = "string";
43
+ prop.format = "uri";
44
+ break;
45
+ default:
46
+ prop.type = "string";
47
+ }
48
+ if (field.label) {
49
+ prop.description = field.label;
50
+ }
51
+ else if (field.placeholder) {
52
+ prop.description = field.placeholder;
53
+ }
54
+ if (field.defaultValue) {
55
+ prop.default = field.defaultValue;
56
+ }
57
+ if (field.pattern) {
58
+ prop.pattern = field.pattern;
59
+ }
60
+ properties[field.name] = prop;
61
+ if (field.required) {
62
+ required.push(field.name);
63
+ }
64
+ }
65
+ return {
66
+ type: "object",
67
+ properties,
68
+ ...(required.length > 0 ? { required } : {}),
69
+ };
70
+ }
71
+ function schemaFromSample(sample) {
72
+ if (sample === null || sample === undefined) {
73
+ return { type: "string" };
74
+ }
75
+ if (typeof sample === "string") {
76
+ return detectStringFormat(sample);
77
+ }
78
+ if (typeof sample === "number") {
79
+ return Number.isInteger(sample)
80
+ ? { type: "integer" }
81
+ : { type: "number" };
82
+ }
83
+ if (typeof sample === "boolean") {
84
+ return { type: "boolean" };
85
+ }
86
+ if (Array.isArray(sample)) {
87
+ if (sample.length === 0) {
88
+ return { type: "array" };
89
+ }
90
+ return {
91
+ type: "array",
92
+ items: schemaFromSample(sample[0]),
93
+ };
94
+ }
95
+ if (typeof sample === "object") {
96
+ const properties = {};
97
+ for (const [key, value] of Object.entries(sample)) {
98
+ properties[key] = schemaFromSample(value);
99
+ }
100
+ return {
101
+ type: "object",
102
+ properties,
103
+ };
104
+ }
105
+ return { type: "string" };
106
+ }
107
+ function detectStringFormat(value) {
108
+ const schema = { type: "string" };
109
+ if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
110
+ schema.format = "email";
111
+ return schema;
112
+ }
113
+ if (/^https?:\/\//.test(value)) {
114
+ schema.format = "uri";
115
+ return schema;
116
+ }
117
+ if (/^\d{4}-\d{2}-\d{2}$/.test(value)) {
118
+ schema.format = "date";
119
+ schema.description = "Date in YYYY-MM-DD format";
120
+ return schema;
121
+ }
122
+ if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/.test(value)) {
123
+ schema.format = "date-time";
124
+ return schema;
125
+ }
126
+ return schema;
127
+ }
128
+ //# sourceMappingURL=schema-inferrer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-inferrer.js","sourceRoot":"","sources":["../../src/extractor/schema-inferrer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ export type { JsonSchema, FieldSpec, NetworkCall, Action, FormSubmitAction, ClickFlowAction, ApiCallAction, RouteChangeAction, HandlerStep, HandlerTemplate, SafetyLevel, Safety, ToolSpec, AuthMethod, OutputTarget, OutputLang, Framework, AutogenConfig, DomSnapshot, DomForm, DomButton, DomLink, ScanResult, ScanProgressEvent, LintSeverity, LintWarning, LintResult, ExportResult, ExportFile, } from "./types.js";
2
+ export { FieldSpecSchema, NetworkCallSchema, FormSubmitActionSchema, ClickFlowActionSchema, ApiCallActionSchema, RouteChangeActionSchema, ActionSchema, SafetySchema, ToolSpecSchema, } from "./utils/validation.js";
3
+ export { lintTools, lintSummary } from "./linter/linter.js";
4
+ export { redact, isSensitiveFieldName } from "./utils/redact.js";
5
+ import type { ScanResult, ToolSpec, OutputTarget, ExportResult, ScanProgressEvent } from "./types.js";
6
+ export interface ScanOptions {
7
+ /** URL to scan. */
8
+ url: string;
9
+ /** Max crawl depth (default: 2). */
10
+ depth?: number;
11
+ /** Page load timeout in ms (default: 30000). */
12
+ timeout?: number;
13
+ /** Run browser in headless mode (default: true). */
14
+ headless?: boolean;
15
+ /** Playwright browser executable path. */
16
+ executablePath?: string;
17
+ /** CSS selectors to ignore during crawling. */
18
+ ignoreSelectors?: string[];
19
+ /** Session cookie string for authenticated scanning. */
20
+ cookie?: string;
21
+ /** Progress callback fired for each page visited. */
22
+ onProgress?: (event: ScanProgressEvent) => void;
23
+ }
24
+ export interface ProposeOptions {
25
+ /** Minimum confidence threshold (default: 0.5). */
26
+ minConfidence?: number;
27
+ /** Use LLM for naming/descriptions (default: false). */
28
+ useLlm?: boolean;
29
+ /** LLM model identifier. */
30
+ llmModel?: string;
31
+ }
32
+ export interface ExportOptions {
33
+ /** Output language for snippet format. */
34
+ lang?: "ts" | "js";
35
+ /** Domain for output metadata. */
36
+ domain?: string;
37
+ }
38
+ /**
39
+ * Scan a website using Playwright, capturing DOM snapshots and network calls.
40
+ * Requires `playwright` as a peer dependency.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const result = await scanUrl({ url: "https://example.com", depth: 2 });
45
+ * console.log(`Scanned ${result.metadata.pagesVisited} pages`);
46
+ * ```
47
+ */
48
+ export declare function scanUrl(options: ScanOptions): Promise<ScanResult>;
49
+ /**
50
+ * Extract actions from scan data and cluster them into tool definitions.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * const result = await scanUrl({ url: "https://example.com" });
55
+ * const tools = proposeTools(result, { minConfidence: 0.6 });
56
+ * ```
57
+ */
58
+ export declare function proposeTools(scanResult: ScanResult, options?: ProposeOptions): ToolSpec[];
59
+ /**
60
+ * Export tool definitions to a specific format.
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * const result = exportTools(tools, "manifest", { domain: "example.com" });
65
+ * console.log(result.files[0].content);
66
+ * ```
67
+ */
68
+ export declare function exportTools(tools: ToolSpec[], format: OutputTarget, options?: ExportOptions): ExportResult;
69
+ /**
70
+ * Scan a URL and generate tool definitions in a single call.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * import { generateToolDefinitions } from "@keak/webmcp-core";
75
+ *
76
+ * const tools = await generateToolDefinitions("https://example.com", {
77
+ * depth: 2,
78
+ * headless: true,
79
+ * minConfidence: 0.5,
80
+ * });
81
+ *
82
+ * for (const tool of tools) {
83
+ * console.log(`${tool.name}: ${tool.description}`);
84
+ * }
85
+ * ```
86
+ */
87
+ export declare function generateToolDefinitions(url: string, options?: Omit<ScanOptions, "url"> & ProposeOptions): Promise<ToolSpec[]>;
88
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,MAAM,EACN,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,WAAW,EACX,MAAM,EACN,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,OAAO,EACP,SAAS,EACT,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EACV,UAAU,EAIV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAYpB,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA8EvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,cAAmB,GAC3B,QAAQ,EAAE,CAiBZ;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAed;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,cAAmB,GACtD,OAAO,CAAC,QAAQ,EAAE,CAAC,CAIrB"}
package/dist/index.js ADDED
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSensitiveFieldName = exports.redact = exports.lintSummary = exports.lintTools = exports.ToolSpecSchema = exports.SafetySchema = exports.ActionSchema = exports.RouteChangeActionSchema = exports.ApiCallActionSchema = exports.ClickFlowActionSchema = exports.FormSubmitActionSchema = exports.NetworkCallSchema = exports.FieldSpecSchema = void 0;
4
+ exports.scanUrl = scanUrl;
5
+ exports.proposeTools = proposeTools;
6
+ exports.exportTools = exportTools;
7
+ exports.generateToolDefinitions = generateToolDefinitions;
8
+ var validation_js_1 = require("./utils/validation.js");
9
+ Object.defineProperty(exports, "FieldSpecSchema", { enumerable: true, get: function () { return validation_js_1.FieldSpecSchema; } });
10
+ Object.defineProperty(exports, "NetworkCallSchema", { enumerable: true, get: function () { return validation_js_1.NetworkCallSchema; } });
11
+ Object.defineProperty(exports, "FormSubmitActionSchema", { enumerable: true, get: function () { return validation_js_1.FormSubmitActionSchema; } });
12
+ Object.defineProperty(exports, "ClickFlowActionSchema", { enumerable: true, get: function () { return validation_js_1.ClickFlowActionSchema; } });
13
+ Object.defineProperty(exports, "ApiCallActionSchema", { enumerable: true, get: function () { return validation_js_1.ApiCallActionSchema; } });
14
+ Object.defineProperty(exports, "RouteChangeActionSchema", { enumerable: true, get: function () { return validation_js_1.RouteChangeActionSchema; } });
15
+ Object.defineProperty(exports, "ActionSchema", { enumerable: true, get: function () { return validation_js_1.ActionSchema; } });
16
+ Object.defineProperty(exports, "SafetySchema", { enumerable: true, get: function () { return validation_js_1.SafetySchema; } });
17
+ Object.defineProperty(exports, "ToolSpecSchema", { enumerable: true, get: function () { return validation_js_1.ToolSpecSchema; } });
18
+ var linter_js_1 = require("./linter/linter.js");
19
+ Object.defineProperty(exports, "lintTools", { enumerable: true, get: function () { return linter_js_1.lintTools; } });
20
+ Object.defineProperty(exports, "lintSummary", { enumerable: true, get: function () { return linter_js_1.lintSummary; } });
21
+ var redact_js_1 = require("./utils/redact.js");
22
+ Object.defineProperty(exports, "redact", { enumerable: true, get: function () { return redact_js_1.redact; } });
23
+ Object.defineProperty(exports, "isSensitiveFieldName", { enumerable: true, get: function () { return redact_js_1.isSensitiveFieldName; } });
24
+ const form_extractor_js_1 = require("./extractor/form-extractor.js");
25
+ const api_extractor_js_1 = require("./extractor/api-extractor.js");
26
+ const click_extractor_js_1 = require("./extractor/click-extractor.js");
27
+ const route_extractor_js_1 = require("./extractor/route-extractor.js");
28
+ const clusterer_js_1 = require("./synthesizer/clusterer.js");
29
+ const snippet_js_1 = require("./exporter/snippet.js");
30
+ const manifest_js_1 = require("./exporter/manifest.js");
31
+ const userscript_js_1 = require("./exporter/userscript.js");
32
+ const yaml_js_1 = require("./exporter/yaml.js");
33
+ /**
34
+ * Scan a website using Playwright, capturing DOM snapshots and network calls.
35
+ * Requires `playwright` as a peer dependency.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * const result = await scanUrl({ url: "https://example.com", depth: 2 });
40
+ * console.log(`Scanned ${result.metadata.pagesVisited} pages`);
41
+ * ```
42
+ */
43
+ async function scanUrl(options) {
44
+ const { url, depth = 2, timeout = 30000, headless = true, executablePath, ignoreSelectors = [], cookie, onProgress, } = options;
45
+ // Playwright is lazily imported so it stays an optional peer dep
46
+ const { launchBrowser } = await import("./scanner/browser.js");
47
+ const { crawlSite } = await import("./scanner/crawler.js");
48
+ const { captureDom } = await import("./scanner/dom-capture.js");
49
+ const { createNetworkRecorder } = await import("./scanner/network-capture.js");
50
+ const { browser, context, page } = await launchBrowser({
51
+ executablePath,
52
+ headless,
53
+ cookie,
54
+ });
55
+ const allPages = [];
56
+ const allNetworkCalls = [];
57
+ let pageCount = 0;
58
+ const startedAt = new Date().toISOString();
59
+ try {
60
+ const networkRecorder = createNetworkRecorder(page, url);
61
+ for await (const visit of crawlSite(page, url, {
62
+ depth,
63
+ timeout,
64
+ ignoreSelectors,
65
+ })) {
66
+ pageCount++;
67
+ onProgress?.({
68
+ type: "page_visiting",
69
+ url: visit.url,
70
+ depth: visit.depth,
71
+ });
72
+ const domSnapshot = await captureDom(page);
73
+ allPages.push(domSnapshot);
74
+ onProgress?.({
75
+ type: "page_visited",
76
+ url: visit.url,
77
+ formsFound: domSnapshot.forms.length,
78
+ buttonsFound: domSnapshot.buttons.length,
79
+ });
80
+ }
81
+ allNetworkCalls.push(...networkRecorder.getCalls());
82
+ networkRecorder.stop();
83
+ }
84
+ finally {
85
+ await browser.close();
86
+ }
87
+ const scanResult = {
88
+ pages: allPages,
89
+ networkCalls: allNetworkCalls,
90
+ actions: [],
91
+ metadata: {
92
+ baseUrl: url,
93
+ startedAt,
94
+ completedAt: new Date().toISOString(),
95
+ pagesVisited: pageCount,
96
+ depth,
97
+ },
98
+ };
99
+ onProgress?.({ type: "complete", summary: scanResult.metadata });
100
+ return scanResult;
101
+ }
102
+ /**
103
+ * Extract actions from scan data and cluster them into tool definitions.
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * const result = await scanUrl({ url: "https://example.com" });
108
+ * const tools = proposeTools(result, { minConfidence: 0.6 });
109
+ * ```
110
+ */
111
+ function proposeTools(scanResult, options = {}) {
112
+ const { minConfidence = 0.5 } = options;
113
+ const actions = [
114
+ ...(0, form_extractor_js_1.extractForms)(scanResult.pages),
115
+ ...(0, api_extractor_js_1.extractApiCalls)(scanResult.networkCalls, scanResult.pages, scanResult.metadata.baseUrl),
116
+ ...(0, click_extractor_js_1.extractClickFlows)(scanResult.pages),
117
+ ...(0, route_extractor_js_1.extractRouteChanges)(scanResult.pages),
118
+ ];
119
+ if (actions.length === 0)
120
+ return [];
121
+ return (0, clusterer_js_1.clusterActions)(actions, { minConfidence });
122
+ }
123
+ /**
124
+ * Export tool definitions to a specific format.
125
+ *
126
+ * @example
127
+ * ```ts
128
+ * const result = exportTools(tools, "manifest", { domain: "example.com" });
129
+ * console.log(result.files[0].content);
130
+ * ```
131
+ */
132
+ function exportTools(tools, format, options = {}) {
133
+ const { lang = "ts", domain = "unknown-domain" } = options;
134
+ switch (format) {
135
+ case "snippet":
136
+ return (0, snippet_js_1.generateSnippet)(tools, { lang, domain });
137
+ case "manifest":
138
+ return (0, manifest_js_1.generateManifest)(tools, { domain });
139
+ case "userscript":
140
+ return (0, userscript_js_1.generateUserscript)(tools, { domain });
141
+ case "yaml":
142
+ return (0, yaml_js_1.generateYaml)(tools, { domain });
143
+ default:
144
+ throw new Error(`Unknown export format: ${format}`);
145
+ }
146
+ }
147
+ /**
148
+ * Scan a URL and generate tool definitions in a single call.
149
+ *
150
+ * @example
151
+ * ```ts
152
+ * import { generateToolDefinitions } from "@keak/webmcp-core";
153
+ *
154
+ * const tools = await generateToolDefinitions("https://example.com", {
155
+ * depth: 2,
156
+ * headless: true,
157
+ * minConfidence: 0.5,
158
+ * });
159
+ *
160
+ * for (const tool of tools) {
161
+ * console.log(`${tool.name}: ${tool.description}`);
162
+ * }
163
+ * ```
164
+ */
165
+ async function generateToolDefinitions(url, options = {}) {
166
+ const { minConfidence, useLlm, llmModel, ...scanOptions } = options;
167
+ const scanResult = await scanUrl({ url, ...scanOptions });
168
+ return proposeTools(scanResult, { minConfidence, useLlm, llmModel });
169
+ }
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolSpec, LintResult } from "../types.js";
2
+ export declare function lintTools(tools: ToolSpec[]): LintResult[];
3
+ export declare function lintSummary(results: LintResult[]): {
4
+ totalTools: number;
5
+ totalWarnings: number;
6
+ errors: number;
7
+ warnings: number;
8
+ info: number;
9
+ };
10
+ //# sourceMappingURL=linter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/linter/linter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,CAKzD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CA4BA"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lintTools = lintTools;
4
+ exports.lintSummary = lintSummary;
5
+ const rules_js_1 = require("./rules.js");
6
+ function lintTools(tools) {
7
+ return tools.map((tool) => ({
8
+ tool,
9
+ warnings: rules_js_1.rules.flatMap((rule) => rule(tool)),
10
+ }));
11
+ }
12
+ function lintSummary(results) {
13
+ let errors = 0;
14
+ let warnings = 0;
15
+ let info = 0;
16
+ for (const result of results) {
17
+ for (const w of result.warnings) {
18
+ switch (w.severity) {
19
+ case "error":
20
+ errors++;
21
+ break;
22
+ case "warning":
23
+ warnings++;
24
+ break;
25
+ case "info":
26
+ info++;
27
+ break;
28
+ }
29
+ }
30
+ }
31
+ return {
32
+ totalTools: results.length,
33
+ totalWarnings: errors + warnings + info,
34
+ errors,
35
+ warnings,
36
+ info,
37
+ };
38
+ }
39
+ //# sourceMappingURL=linter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter/linter.ts"],"names":[],"mappings":";;AAGA,8BAKC;AAED,kCAkCC;AA3CD,yCAAmC;AAEnC,SAAgB,SAAS,CAAC,KAAiB;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI;QACJ,QAAQ,EAAE,gBAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC9C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAgB,WAAW,CAAC,OAAqB;IAO/C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACnB,KAAK,OAAO;oBACV,MAAM,EAAE,CAAC;oBACT,MAAM;gBACR,KAAK,SAAS;oBACZ,QAAQ,EAAE,CAAC;oBACX,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,EAAE,CAAC;oBACP,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,aAAa,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;QACvC,MAAM;QACN,QAAQ;QACR,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ToolSpec, LintWarning } from "../types.js";
2
+ export type LintRule = (tool: ToolSpec) => LintWarning[];
3
+ export declare const rules: LintRule[];
4
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/linter/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AAEvE,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,WAAW,EAAE,CAAC;AAEzD,eAAO,MAAM,KAAK,EAAE,QAAQ,EAM3B,CAAC"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rules = void 0;
4
+ exports.rules = [
5
+ namingConvention,
6
+ descriptionQuality,
7
+ schemaCompleteness,
8
+ safetyAnnotation,
9
+ inputSchemaDesign,
10
+ ];
11
+ function namingConvention(tool) {
12
+ const warnings = [];
13
+ if (tool.name !== tool.name.toLowerCase()) {
14
+ warnings.push(warn(tool, "naming/lowercase", "error", "Tool name must be lowercase.", `Rename to "${tool.name.toLowerCase()}".`));
15
+ }
16
+ if (!/^[a-z][a-z0-9_]*$/.test(tool.name)) {
17
+ warnings.push(warn(tool, "naming/snake-case", "error", "Tool name must be snake_case (letters, numbers, underscores only)."));
18
+ }
19
+ const segments = tool.name.split("_");
20
+ if (segments.length < 2) {
21
+ warnings.push(warn(tool, "naming/segments", "warning", "Tool name should follow domain_verb_noun pattern (at least verb_noun).", "Add a domain prefix and/or verb, e.g., 'mysite_search_items'."));
22
+ }
23
+ if (tool.name.length > 64) {
24
+ warnings.push(warn(tool, "naming/length", "warning", `Tool name is ${tool.name.length} chars (max recommended: 64).`, "Shorten the name while keeping it descriptive."));
25
+ }
26
+ return warnings;
27
+ }
28
+ function descriptionQuality(tool) {
29
+ const warnings = [];
30
+ if (!tool.description || tool.description.length < 10) {
31
+ warnings.push(warn(tool, "description/length", "error", "Tool description is too short (minimum 10 characters).", "Write a clear sentence explaining what this tool does."));
32
+ }
33
+ if (tool.description && tool.description.length > 500) {
34
+ warnings.push(warn(tool, "description/length", "warning", `Tool description is ${tool.description.length} chars (max recommended: 500).`, "Keep descriptions concise — AI models work better with shorter descriptions."));
35
+ }
36
+ const firstWord = tool.description?.split(" ")[0]?.toLowerCase() || "";
37
+ const actionVerbs = [
38
+ "search", "find", "get", "fetch", "create", "submit", "update",
39
+ "delete", "remove", "send", "login", "register", "book", "navigate",
40
+ "click", "filter", "sort", "subscribe", "log", "run", "execute",
41
+ "make", "check", "list", "view", "show", "download", "upload",
42
+ ];
43
+ if (!actionVerbs.includes(firstWord)) {
44
+ warnings.push(warn(tool, "description/verb", "info", "Consider starting the description with an action verb (e.g., 'Search for...', 'Create a...')."));
45
+ }
46
+ return warnings;
47
+ }
48
+ function schemaCompleteness(tool) {
49
+ const warnings = [];
50
+ const schema = tool.inputSchema;
51
+ if (!schema.properties || Object.keys(schema.properties).length === 0) {
52
+ warnings.push(warn(tool, "schema/empty", "warning", "Input schema has no properties. Tools without parameters are rare.", "Add parameters that the AI model needs to provide."));
53
+ return warnings;
54
+ }
55
+ for (const [name, prop] of Object.entries(schema.properties)) {
56
+ if (!prop.type) {
57
+ warnings.push(warn(tool, "schema/type-missing", "warning", `Property "${name}" has no type defined.`, `Add a type (string, number, boolean, etc.) to "${name}".`));
58
+ }
59
+ if (!prop.description) {
60
+ warnings.push(warn(tool, "schema/description-missing", "info", `Property "${name}" has no description.`, "Add a description to help the AI model understand this field."));
61
+ }
62
+ }
63
+ const requiredCount = schema.required?.length || 0;
64
+ const totalCount = Object.keys(schema.properties).length;
65
+ if (requiredCount === 0 && totalCount > 0) {
66
+ warnings.push(warn(tool, "schema/no-required", "info", "No required fields defined. Consider marking essential fields as required."));
67
+ }
68
+ return warnings;
69
+ }
70
+ function safetyAnnotation(tool) {
71
+ const warnings = [];
72
+ if (tool.safety.level === "danger" && !tool.safety.requiresConfirm) {
73
+ warnings.push(warn(tool, "safety/confirm-danger", "error", "Dangerous tools must require user confirmation.", "Set requiresConfirm: true for danger-level tools."));
74
+ }
75
+ // Name suggests side effects but safety is marked read-only
76
+ if (tool.safety.level === "read") {
77
+ const name = tool.name.toLowerCase();
78
+ if (/create|update|delete|submit|send|post|book|register/.test(name)) {
79
+ warnings.push(warn(tool, "safety/possible-write", "warning", `Tool "${tool.name}" is marked as "read" but its name suggests it may have side effects.`, 'Consider changing safety level to "write" or "danger".'));
80
+ }
81
+ }
82
+ return warnings;
83
+ }
84
+ // Minimize "model math" — avoid making the AI compute values.
85
+ function inputSchemaDesign(tool) {
86
+ const warnings = [];
87
+ const schema = tool.inputSchema;
88
+ if (!schema.properties)
89
+ return warnings;
90
+ const propCount = Object.keys(schema.properties).length;
91
+ if (propCount > 10) {
92
+ warnings.push(warn(tool, "design/too-many-params", "warning", `Tool has ${propCount} parameters. Consider breaking it into smaller tools.`, "AI models work better with focused tools that have fewer parameters."));
93
+ }
94
+ for (const [name, prop] of Object.entries(schema.properties)) {
95
+ if (prop.enum && prop.enum.length > 20) {
96
+ warnings.push(warn(tool, "design/large-enum", "info", `Property "${name}" has ${prop.enum.length} enum options.`, "Consider using a free-text field with validation instead."));
97
+ }
98
+ }
99
+ return warnings;
100
+ }
101
+ function warn(tool, rule, severity, message, suggestion) {
102
+ return {
103
+ toolId: tool.id,
104
+ toolName: tool.name,
105
+ rule,
106
+ severity,
107
+ message,
108
+ suggestion,
109
+ };
110
+ }
111
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/linter/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type Browser, type BrowserContext, type Page } from "playwright";
2
+ export interface BrowserConfig {
3
+ executablePath?: string;
4
+ headless?: boolean;
5
+ userDataDir?: string;
6
+ cookie?: string;
7
+ }
8
+ export interface BrowserSession {
9
+ browser: Browser;
10
+ context: BrowserContext;
11
+ page: Page;
12
+ }
13
+ export declare function launchBrowser(config?: BrowserConfig): Promise<BrowserSession>;
14
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/scanner/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,aAAa,CACjC,MAAM,GAAE,aAAkB,GACzB,OAAO,CAAC,cAAc,CAAC,CA6BzB"}