vskill 1.2.4 → 1.2.7

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 (114) hide show
  1. package/README.md +51 -3
  2. package/agents.json +6 -1
  3. package/dist/agents/agents-registry.d.ts +43 -16
  4. package/dist/agents/agents-registry.js +119 -33
  5. package/dist/agents/agents-registry.js.map +1 -1
  6. package/dist/agents/global-dirs.d.ts +19 -0
  7. package/dist/agents/global-dirs.js +53 -0
  8. package/dist/agents/global-dirs.js.map +1 -0
  9. package/dist/audit/fix-suggestions.js +6 -0
  10. package/dist/audit/fix-suggestions.js.map +1 -1
  11. package/dist/commands/add-github-bundle.d.ts +29 -0
  12. package/dist/commands/add-github-bundle.js +135 -0
  13. package/dist/commands/add-github-bundle.js.map +1 -0
  14. package/dist/commands/add-lockfile.d.ts +2 -0
  15. package/dist/commands/add-lockfile.js +1 -1
  16. package/dist/commands/add-lockfile.js.map +1 -1
  17. package/dist/commands/add.d.ts +5 -7
  18. package/dist/commands/add.js +207 -111
  19. package/dist/commands/add.js.map +1 -1
  20. package/dist/commands/audit-webmcp.d.ts +25 -0
  21. package/dist/commands/audit-webmcp.js +167 -0
  22. package/dist/commands/audit-webmcp.js.map +1 -0
  23. package/dist/commands/doctor.d.ts +69 -0
  24. package/dist/commands/doctor.js +760 -0
  25. package/dist/commands/doctor.js.map +1 -0
  26. package/dist/commands/remove.js +43 -8
  27. package/dist/commands/remove.js.map +1 -1
  28. package/dist/commands/scan.js +1 -1
  29. package/dist/commands/scan.js.map +1 -1
  30. package/dist/commands/update.js +12 -4
  31. package/dist/commands/update.js.map +1 -1
  32. package/dist/discovery/github-skill-bundle.d.ts +74 -0
  33. package/dist/discovery/github-skill-bundle.js +323 -0
  34. package/dist/discovery/github-skill-bundle.js.map +1 -0
  35. package/dist/eval/skill-scanner.js +7 -1
  36. package/dist/eval/skill-scanner.js.map +1 -1
  37. package/dist/eval-server/install-skill-routes.js +10 -3
  38. package/dist/eval-server/install-skill-routes.js.map +1 -1
  39. package/dist/eval-server/remove-skill-routes.js +262 -29
  40. package/dist/eval-server/remove-skill-routes.js.map +1 -1
  41. package/dist/eval-server/studio-privacy.js +2 -3
  42. package/dist/eval-server/studio-privacy.js.map +1 -1
  43. package/dist/eval-server/utils/scan-install-locations.js +22 -3
  44. package/dist/eval-server/utils/scan-install-locations.js.map +1 -1
  45. package/dist/eval-ui/assets/{CreateSkillPage-BUrgworx.js → CreateSkillPage-CXDd6gDN.js} +1 -1
  46. package/dist/eval-ui/assets/{FindSkillsPalette-BstJ22TI.js → FindSkillsPalette-DQ6uGhFP.js} +2 -2
  47. package/dist/eval-ui/assets/{SearchPaletteCore-Dagnc-E7.js → SearchPaletteCore-DpHCf0mf.js} +1 -1
  48. package/dist/eval-ui/assets/{SkillDetailPanel-DnujVk6g.js → SkillDetailPanel-BjHFjGxg.js} +1 -1
  49. package/dist/eval-ui/assets/{UpdateDropdown-B7D2vXrm.js → UpdateDropdown-Cn4Vsq5d.js} +1 -1
  50. package/dist/eval-ui/assets/main-BmB7Zj9I.js +86 -0
  51. package/dist/eval-ui/index.html +1 -1
  52. package/dist/index.js +34 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/installer/bundle-files.d.ts +39 -2
  55. package/dist/installer/bundle-files.js +80 -10
  56. package/dist/installer/bundle-files.js.map +1 -1
  57. package/dist/installer/canonical.d.ts +39 -4
  58. package/dist/installer/canonical.js +178 -24
  59. package/dist/installer/canonical.js.map +1 -1
  60. package/dist/installer/multi-install.d.ts +11 -2
  61. package/dist/installer/multi-install.js +41 -9
  62. package/dist/installer/multi-install.js.map +1 -1
  63. package/dist/installer/transformers/index.d.ts +8 -0
  64. package/dist/installer/yaml-safe-mutate.js +48 -2
  65. package/dist/installer/yaml-safe-mutate.js.map +1 -1
  66. package/dist/lib/github-fetch.js +2 -0
  67. package/dist/lib/github-fetch.js.map +1 -1
  68. package/dist/lib/private-source.d.ts +8 -0
  69. package/dist/lib/private-source.js +16 -2
  70. package/dist/lib/private-source.js.map +1 -1
  71. package/dist/scanner/hidden-content.d.ts +47 -0
  72. package/dist/scanner/hidden-content.js +904 -0
  73. package/dist/scanner/hidden-content.js.map +1 -0
  74. package/dist/scanner/installer-hosts.d.ts +26 -0
  75. package/dist/scanner/installer-hosts.js +92 -0
  76. package/dist/scanner/installer-hosts.js.map +1 -0
  77. package/dist/scanner/judge-guard.d.ts +119 -0
  78. package/dist/scanner/judge-guard.js +481 -0
  79. package/dist/scanner/judge-guard.js.map +1 -0
  80. package/dist/scanner/patterns.d.ts +12 -0
  81. package/dist/scanner/patterns.js +353 -113
  82. package/dist/scanner/patterns.js.map +1 -1
  83. package/dist/scanner/repo-scanner.d.ts +4 -0
  84. package/dist/scanner/repo-scanner.js +4 -1
  85. package/dist/scanner/repo-scanner.js.map +1 -1
  86. package/dist/scanner/tier1.js +37 -7
  87. package/dist/scanner/tier1.js.map +1 -1
  88. package/dist/scanner/tier2-llm.d.ts +22 -4
  89. package/dist/scanner/tier2-llm.js +163 -23
  90. package/dist/scanner/tier2-llm.js.map +1 -1
  91. package/dist/scanner/types.d.ts +8 -0
  92. package/dist/webmcp/args.d.ts +34 -0
  93. package/dist/webmcp/args.js +87 -0
  94. package/dist/webmcp/args.js.map +1 -0
  95. package/dist/webmcp/attribution.d.ts +38 -0
  96. package/dist/webmcp/attribution.js +141 -0
  97. package/dist/webmcp/attribution.js.map +1 -0
  98. package/dist/webmcp/enumerate.d.ts +81 -0
  99. package/dist/webmcp/enumerate.js +436 -0
  100. package/dist/webmcp/enumerate.js.map +1 -0
  101. package/dist/webmcp/format.d.ts +9 -0
  102. package/dist/webmcp/format.js +105 -0
  103. package/dist/webmcp/format.js.map +1 -0
  104. package/dist/webmcp/merge.d.ts +49 -0
  105. package/dist/webmcp/merge.js +167 -0
  106. package/dist/webmcp/merge.js.map +1 -0
  107. package/dist/webmcp/score.d.ts +70 -0
  108. package/dist/webmcp/score.js +586 -0
  109. package/dist/webmcp/score.js.map +1 -0
  110. package/dist/webmcp/types.d.ts +92 -0
  111. package/dist/webmcp/types.js +8 -0
  112. package/dist/webmcp/types.js.map +1 -0
  113. package/package.json +1 -1
  114. package/dist/eval-ui/assets/main-DjA5gpjV.js +0 -86
@@ -0,0 +1,586 @@
1
+ // ---------------------------------------------------------------------------
2
+ // vskill audit-webmcp -- scoring. Pure functions: no browser, no network.
3
+ //
4
+ // Rules
5
+ // WMCP-001 prompt-injection / tool-poisoning text in name, title,
6
+ // description or parameter descriptions (scanContent + WebMCP
7
+ // specific patterns)
8
+ // WMCP-002 write-shaped tool without consequentialHint
9
+ // WMCP-003 write-shaped tool marked readOnlyHint:true
10
+ // WMCP-004 PII-shaped parameters the tool's purpose does not need
11
+ // WMCP-005 tool registered by a script from another site (medium), or by
12
+ // a library from a public npm CDN (info); the hosting platform's
13
+ // own script is not a finding (attribution.ts)
14
+ // WMCP-006 description over 500 chars, or more than 40 tools on the page
15
+ // WMCP-007 inputSchema missing or not a JSON Schema object
16
+ // WMCP-008 tools registered but no Permissions-Policy mentioning tools
17
+ // WMCP-009 tool exposed to other origins via exposedTo
18
+ // ---------------------------------------------------------------------------
19
+ import { scanContent } from "../scanner/patterns.js";
20
+ import { isUnpinned } from "./attribution.js";
21
+ import { SEVERITIES, } from "./types.js";
22
+ export const MAX_DESCRIPTION_CHARS = 500;
23
+ export const MAX_TOOLS_PER_PAGE = 40;
24
+ // ---- Helpers ---------------------------------------------------------------
25
+ /** Split a tool name into lowercase words: "proceedToCheckout" -> [proceed, to, checkout]. */
26
+ export function tokenizeName(name) {
27
+ return name
28
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
29
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
30
+ .toLowerCase()
31
+ .split(/[^a-z0-9]+/)
32
+ .filter(Boolean);
33
+ }
34
+ export function severityRank(s) {
35
+ return SEVERITIES.indexOf(s);
36
+ }
37
+ /** True when `s` is at or above `threshold` (critical is highest). */
38
+ export function atOrAbove(s, threshold) {
39
+ return severityRank(s) <= severityRank(threshold);
40
+ }
41
+ function capSeverity(s, cap) {
42
+ return severityRank(s) < severityRank(cap) ? cap : s;
43
+ }
44
+ export function originOf(url) {
45
+ if (!url)
46
+ return null;
47
+ try {
48
+ const u = new URL(url);
49
+ if (u.protocol !== "http:" && u.protocol !== "https:")
50
+ return null;
51
+ return u.origin;
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ /** Second-level labels under a two-letter country TLD that are public suffixes (example.co.uk). */
58
+ const SLD_UNDER_CCTLD = new Set(["co", "com", "net", "org", "gov", "edu", "ac", "ne", "or", "go", "gob", "gen", "ltd", "plc", "nic", "mil"]);
59
+ /** Hosting suffixes where each subdomain is a different site. */
60
+ const SHARED_HOST_SUFFIXES = [
61
+ "github.io", "gitlab.io", "vercel.app", "netlify.app", "pages.dev", "workers.dev", "herokuapp.com",
62
+ "myshopify.com", "appspot.com", "web.app", "firebaseapp.com", "azurewebsites.net", "cloudfront.net",
63
+ "blogspot.com", "wordpress.com", "onrender.com", "fly.dev", "glitch.me", "s3.amazonaws.com",
64
+ ];
65
+ /**
66
+ * Approximate registrable domain ("site") of a URL: www.shop.example and
67
+ * cdn.shop.example share one. A heuristic without the full Public Suffix
68
+ * List: two-letter ccTLD second levels and common shared hosts are handled.
69
+ */
70
+ export function siteOf(url) {
71
+ const origin = originOf(url);
72
+ if (!origin)
73
+ return null;
74
+ const host = new URL(origin).hostname.toLowerCase().replace(/\.$/, "");
75
+ if (/^[\d.]+$/.test(host) || host.includes(":") || host.startsWith("["))
76
+ return host;
77
+ const labels = host.split(".");
78
+ if (labels.length <= 2)
79
+ return host;
80
+ for (const suffix of SHARED_HOST_SUFFIXES) {
81
+ if (host.endsWith(`.${suffix}`))
82
+ return labels.slice(-(suffix.split(".").length + 1)).join(".");
83
+ }
84
+ const tld = labels[labels.length - 1];
85
+ const sld = labels[labels.length - 2];
86
+ const n = tld.length === 2 && SLD_UNDER_CCTLD.has(sld) ? 3 : 2;
87
+ return labels.slice(-n).join(".");
88
+ }
89
+ /** Parse a schema that may arrive as a JSON string (Chrome's getTools does this). */
90
+ export function parseSchema(raw) {
91
+ if (raw === undefined || raw === null || raw === "")
92
+ return { ok: false, value: undefined };
93
+ if (typeof raw === "string") {
94
+ try {
95
+ return { ok: true, value: JSON.parse(raw) };
96
+ }
97
+ catch {
98
+ return { ok: false, value: raw };
99
+ }
100
+ }
101
+ return { ok: true, value: raw };
102
+ }
103
+ function isPlainObject(v) {
104
+ return typeof v === "object" && v !== null && !Array.isArray(v);
105
+ }
106
+ /** Walk object properties (nested objects and array items) of a JSON Schema. */
107
+ export function schemaParams(schema, prefix = "", depth = 0) {
108
+ if (!isPlainObject(schema) || depth > 6)
109
+ return [];
110
+ const out = [];
111
+ const props = schema.properties;
112
+ if (isPlainObject(props)) {
113
+ for (const [key, sub] of Object.entries(props)) {
114
+ const path = prefix ? `${prefix}.${key}` : key;
115
+ const desc = isPlainObject(sub) && typeof sub.description === "string" ? sub.description : undefined;
116
+ out.push({ path, key, description: desc });
117
+ out.push(...schemaParams(sub, path, depth + 1));
118
+ }
119
+ }
120
+ if (isPlainObject(schema.items)) {
121
+ out.push(...schemaParams(schema.items, prefix ? `${prefix}[]` : "[]", depth + 1));
122
+ }
123
+ return out;
124
+ }
125
+ const READ_VERBS = new Set([
126
+ "get", "list", "search", "find", "view", "show", "lookup", "look", "check", "read",
127
+ "fetch", "query", "browse", "describe", "preview", "estimate", "calculate", "compare",
128
+ "track", "retrieve", "count", "explore", "filter", "sort", "recommend", "suggest",
129
+ "validate", "verify", "inspect", "summarize", "explain", "is", "has", "can",
130
+ ]);
131
+ /** Verbs that open a read-only description ("Returns ...", "Answers ..."). Not used for names: return_item is a write. */
132
+ const DESCRIPTION_READ_LEADS = new Set([...READ_VERBS, "return", "answer", "provide", "display", "open"]);
133
+ /** Always write-shaped wherever they appear in the name. */
134
+ const HIGH_WORDS = new Set([
135
+ "checkout", "pay", "purchase", "buy", "delete", "destroy", "erase", "withdraw", "donate",
136
+ ]);
137
+ /** Noun or verb: write-shaped only as the first word or after a write verb (place_order, not order_lookup). */
138
+ const HIGH_AMBIGUOUS = new Set(["order", "payment", "transfer", "charge"]);
139
+ const MEDIUM_WORDS = new Set([
140
+ "remove", "cancel", "submit", "reserve", "rsvp", "signup", "subscribe", "unsubscribe",
141
+ "send", "publish", "enroll",
142
+ ]);
143
+ const MEDIUM_AMBIGUOUS = new Set(["book", "post", "register"]);
144
+ /** Verbs that make a following ambiguous noun an action: cancel_order, create_post. */
145
+ const WRITE_VERBS = new Set([
146
+ "place", "create", "make", "submit", "confirm", "complete", "process", "new", "start",
147
+ "initiate", "execute", "perform", "schedule", "add", "update", "edit", "modify", "change",
148
+ "amend", "cancel", "send", "write", "publish", "proceed", "finalize", "finalise", "set",
149
+ "save", "issue", "request", "apply", "accept", "approve", "reject",
150
+ ]);
151
+ /** A word that turns an ambiguous noun into a read: order_status, book_details, payment_methods. */
152
+ const NOUN_CONTEXT = new Set([
153
+ "status", "history", "details", "detail", "tracking", "info", "summary", "methods", "method",
154
+ "options", "option", "policy", "policies", "list", "lookup", "count", "total", "url", "link",
155
+ "page", "number", "id", "date", "estimate", "preview",
156
+ ]);
157
+ /** UI state, not data: remove_filter, cancel_modal, submit_search. */
158
+ const UI_STATE_NOUNS = new Set([
159
+ "filter", "filters", "facet", "facets", "sort", "sorting", "selection", "highlight", "highlights",
160
+ "tab", "tabs", "panel", "modal", "dialog", "popup", "menu", "overlay", "banner", "toast",
161
+ "tooltip", "view", "zoom", "search", "query",
162
+ ]);
163
+ const CART_NOUNS = new Set(["cart", "bag", "basket"]);
164
+ const CART_VERBS = new Set(["add", "update", "remove", "set", "empty", "clear", "modify", "change", "edit", "cancel"]);
165
+ const DESCRIPTION_WRITE_PATTERNS = [
166
+ { tier: "high", re: /\b(?:place|submit|complete|finali[sz]e|confirm)s?\s+(?:an?\s+|the\s+|your\s+|their\s+)?(?:order|purchase|payment|checkout)\b/i },
167
+ { tier: "high", re: /\b(?:proceed|go|continue)s?\s+to\s+(?:the\s+)?checkout\b/i },
168
+ { tier: "high", re: /\bmakes?\s+(?:a\s+)?payments?\b/i },
169
+ { tier: "high", re: /\b(?:purchase|buy)s?\s+(?:an?|the|this|these|your)\b/i },
170
+ { tier: "high", re: /\bpermanently\s+(?:delete|remove)s?\b|\bdeletes?\s+(?:an?|the|this|your|all)\b/i },
171
+ { tier: "high", re: /\btransfers?\s+(?:funds|money)\b/i },
172
+ { tier: "high", re: /\bcharges?\s+(?:the\s+)?(?:card|customer|user)\b/i },
173
+ { tier: "low", re: /\badds?\s+(?:an?\s+|the\s+)?(?:\w+\s+){0,2}to\s+(?:the\s+|your\s+|a\s+)?(?:cart|bag|basket)\b/i },
174
+ { tier: "low", re: /\b(?:updates?|modif(?:y|ies)|changes?|empt(?:y|ies)|clears?)\s+(?:the\s+|your\s+)?(?:shopping\s+)?(?:cart|bag|basket)\b/i },
175
+ { tier: "medium", re: /\bcancels?\s+(?:an?|the|this|your)\b/i },
176
+ { tier: "medium", re: /\bsends?\s+(?:an?\s+|the\s+)?(?:email|message|sms|text|invite|invitation)\b/i },
177
+ { tier: "medium", re: /\b(?:subscribes?|signs?\s+up|registers?)\s+(?:the\s+user\s+)?(?:to|for)\b/i },
178
+ { tier: "medium", re: /\b(?:books?|reserves?)\s+(?:an?|the)\s+\w+/i },
179
+ { tier: "medium", re: /\bpublish(?:es)?\s+(?:an?|the|this|your)\b/i },
180
+ { tier: "medium", re: /\bsubmits?\s+(?:an?|the|this|your)\b/i },
181
+ { tier: "medium", re: /\brsvps?\b/i },
182
+ { tier: "medium", re: /\bposts?\s+(?:an?\s+)?(?:comment|review|message|reply)\b/i },
183
+ { tier: "medium", re: /\bremoves?\s+(?:an?|the|this)\b/i },
184
+ ];
185
+ /** "Returns" -> "return", "Searches" -> "search", "Retrieves" -> "retrieve". */
186
+ function leadVerb(description) {
187
+ const m = /^\s*(?:this\s+tool\s+)?([a-z]+)/i.exec(description);
188
+ if (!m)
189
+ return null;
190
+ const w = m[1].toLowerCase();
191
+ if (DESCRIPTION_READ_LEADS.has(w))
192
+ return w;
193
+ if (w.endsWith("ies"))
194
+ return `${w.slice(0, -3)}y`;
195
+ if (w.endsWith("es") && DESCRIPTION_READ_LEADS.has(w.slice(0, -2)))
196
+ return w.slice(0, -2);
197
+ if (w.endsWith("s"))
198
+ return w.slice(0, -1);
199
+ return w;
200
+ }
201
+ /** An ambiguous noun/verb counts as a write when it leads the name or follows a write verb, and no read noun qualifies it. */
202
+ function ambiguousIsWrite(tokens, i) {
203
+ if (tokens.some((t) => NOUN_CONTEXT.has(t)))
204
+ return false;
205
+ return i === 0 || tokens.slice(0, i).some((t) => WRITE_VERBS.has(t));
206
+ }
207
+ /** Does the tool look like it changes state (buys, deletes, sends, books ...)? */
208
+ export function classifyWriteShape(tool) {
209
+ const tokens = tokenizeName(tool.name);
210
+ if (tokens.length === 0)
211
+ return null;
212
+ if (READ_VERBS.has(tokens[0]))
213
+ return null;
214
+ const joined = tokens.join("_");
215
+ const words = new Set(tokens);
216
+ if (joined.includes("sign_up"))
217
+ words.add("signup");
218
+ for (let i = 0; i < tokens.length; i++) {
219
+ const t = tokens[i];
220
+ if (t === "checkout" && tokens.some((x) => NOUN_CONTEXT.has(x)))
221
+ continue;
222
+ if (HIGH_WORDS.has(t))
223
+ return { tier: "high", reason: t };
224
+ if (HIGH_AMBIGUOUS.has(t) && ambiguousIsWrite(tokens, i))
225
+ return { tier: "high", reason: t };
226
+ }
227
+ const hasCartNoun = tokens.some((t) => CART_NOUNS.has(t));
228
+ const cartVerb = tokens.find((t) => CART_VERBS.has(t));
229
+ if (hasCartNoun && cartVerb)
230
+ return { tier: "low", reason: `${cartVerb} cart` };
231
+ if (tokens.some((t) => UI_STATE_NOUNS.has(t)))
232
+ return null;
233
+ for (const t of words) {
234
+ if (MEDIUM_WORDS.has(t))
235
+ return { tier: "medium", reason: t };
236
+ }
237
+ for (let i = 0; i < tokens.length; i++) {
238
+ if (MEDIUM_AMBIGUOUS.has(tokens[i]) && ambiguousIsWrite(tokens, i))
239
+ return { tier: "medium", reason: tokens[i] };
240
+ }
241
+ const desc = tool.description ?? "";
242
+ const lead = leadVerb(desc);
243
+ if (lead && DESCRIPTION_READ_LEADS.has(lead))
244
+ return null;
245
+ for (const { tier, re } of DESCRIPTION_WRITE_PATTERNS) {
246
+ const m = re.exec(desc);
247
+ // "Does NOT add anything to the cart" describes what the tool avoids.
248
+ if (m && !/\b(?:not|never|no|cannot|can't|won't|doesn't|don't)\s+(?:\w+\s+)?$/i.test(desc.slice(Math.max(0, m.index - 24), m.index))) {
249
+ return { tier, reason: `description: "${m[0]}"` };
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ /** WebMCP-specific tool-poisoning shapes not covered by scanContent. */
255
+ export const POISON_PATTERNS = [
256
+ { id: "WP-01", name: "hidden instruction tag", severity: "high", re: /<\s*\/?\s*(?:important|system|instructions?|secret|hidden)\s*>/i },
257
+ { id: "WP-02", name: "conceals actions from the user", severity: "high", re: /\b(?:do\s+not|don['’]?t|never)\s+(?:tell|inform|mention|reveal|show|notify|disclose)\s+(?:this\s+)?(?:to\s+)?(?:the\s+)?user\b/i },
258
+ { id: "WP-03", name: "overrides prior instructions", severity: "high", re: /\b(?:disregard|forget|override)\s+(?:all\s+)?(?:previous|prior|earlier|other|your)\s+(?:instructions|rules|guidelines|tools)\b/i },
259
+ { id: "WP-04", name: "tool shadowing", severity: "medium", re: /\b(?:instead\s+of|rather\s+than)\s+(?:using\s+)?(?:any\s+)?other\s+tools?\b|\balways\s+(?:call|use|invoke|run)\s+this\s+tool\s+(?:first|before)\b/i },
260
+ { id: "WP-05", name: "invisible or bidi characters", severity: "high", re: /[\u200B-\u200F\u202A-\u202E\u2060-\u2064\uFEFF]|[\u{E0000}-\u{E007F}]/u },
261
+ { id: "WP-07", name: "tells the agent to skip user confirmation", severity: "medium", re: /\b(?:do\s+not|don['\u2019]?t|never|no\s+need\s+to)\s+(?:ask|prompt|check\s+with)\s+(?:the\s+user\s+)?(?:to\s+|for\s+)?confirm(?:ation)?\b|\bwithout\s+(?:asking|confirming\s+with|checking\s+with)\s+(?:the\s+)?user\b/i },
262
+ { id: "WP-06", name: "asks for conversation or secrets", severity: "high", re: /\b(?:include|send|pass|append|attach)\s+(?:the\s+)?(?:user['’]?s?\s+)?(?:full\s+)?(?:conversation|chat\s+history|previous\s+messages|system\s+prompt|cookies?|session\s+tokens?|api\s+keys?|passwords?)\b/i },
263
+ ];
264
+ function toolTextFields(tool) {
265
+ const fields = [{ field: "name", text: tool.name }];
266
+ if (tool.title)
267
+ fields.push({ field: "title", text: tool.title });
268
+ if (tool.description)
269
+ fields.push({ field: "description", text: tool.description });
270
+ const parsed = parseSchema(tool.inputSchema);
271
+ if (parsed.ok) {
272
+ for (const p of schemaParams(parsed.value)) {
273
+ if (p.description)
274
+ fields.push({ field: `param ${p.path}`, text: p.description });
275
+ }
276
+ }
277
+ return fields;
278
+ }
279
+ /**
280
+ * Remove invisible characters that real text needs before WP-05 runs:
281
+ * emoji ZWJ sequences, subdivision flags (tag characters), ZWJ/ZWNJ in
282
+ * scripts that use them for shaping, LRM/RLM in right-to-left text, and a
283
+ * leading BOM.
284
+ */
285
+ export function stripBenignInvisibles(text) {
286
+ let t = text.replace(/^\uFEFF/, "");
287
+ t = t.replace(/\u{1F3F4}[\u{E0020}-\u{E007E}]+\u{E007F}/gu, "");
288
+ t = t.replace(/(?<=[\p{Extended_Pictographic}\p{Emoji_Modifier}\uFE0F])\u200D(?=\p{Extended_Pictographic})/gu, "");
289
+ t = t.replace(/(?<=[\p{Script=Arabic}\p{Script=Syriac}\p{Script=Hebrew}\p{Script=Devanagari}\p{Script=Bengali}\p{Script=Gurmukhi}\p{Script=Gujarati}\p{Script=Oriya}\p{Script=Tamil}\p{Script=Telugu}\p{Script=Kannada}\p{Script=Malayalam}\p{Script=Sinhala}\p{Script=Khmer}\p{Script=Myanmar}])[\u200C\u200D]/gu, "");
290
+ if (/[\p{Script=Hebrew}\p{Script=Arabic}]/u.test(t))
291
+ t = t.replace(/[\u200E\u200F]/g, "");
292
+ return t;
293
+ }
294
+ function poisoningFindings(tool) {
295
+ const out = [];
296
+ const seen = new Set();
297
+ for (const { field, text } of toolTextFields(tool)) {
298
+ for (const f of scanContent(text)) {
299
+ const key = `${f.patternId}|${field}`;
300
+ if (seen.has(key))
301
+ continue;
302
+ seen.add(key);
303
+ // Code-shaped patterns are rarely meaningful in prose; keep prompt
304
+ // injection and credential theft at full strength, cap the rest.
305
+ const severity = f.category === "prompt-injection" || f.category === "credential-theft"
306
+ ? f.severity
307
+ : capSeverity(f.severity, "medium");
308
+ out.push({
309
+ id: "WMCP-001",
310
+ severity,
311
+ tool: tool.name,
312
+ message: `${field}: ${f.patternName} (${f.patternId}) matched "${truncate(f.match, 60)}"`,
313
+ });
314
+ }
315
+ for (const p of POISON_PATTERNS) {
316
+ const m = p.re.exec(p.id === "WP-05" ? stripBenignInvisibles(text) : text);
317
+ if (!m)
318
+ continue;
319
+ const key = `${p.id}|${field}`;
320
+ if (seen.has(key))
321
+ continue;
322
+ seen.add(key);
323
+ out.push({
324
+ id: "WMCP-001",
325
+ severity: p.severity,
326
+ tool: tool.name,
327
+ message: `${field}: ${p.name} (${p.id}) matched "${truncate(visible(m[0]), 60)}"`,
328
+ });
329
+ }
330
+ }
331
+ return out;
332
+ }
333
+ function truncate(s, n) {
334
+ return s.length > n ? `${s.slice(0, n - 1)}…` : s;
335
+ }
336
+ function visible(s) {
337
+ return s.replace(/[^\x20-\x7E]/gu, (c) => `U+${c.codePointAt(0).toString(16).toUpperCase().padStart(4, "0")}`);
338
+ }
339
+ const PII_KINDS = [
340
+ { kind: "email", severity: "info", key: /e-?mail/i, purpose: /e-?mail|newsletter|subscri|sign\s*up|signup|register|contact|account|login|notify|invite|receipt|checkout|order|share|send|booking|book|reserv|rsvp|ticket/i },
341
+ { kind: "phone", severity: "info", key: /phone|mobile|msisdn|^tel$/i, purpose: /phone|sms|text|call|contact|whatsapp|book|reserv|deliver|ship|checkout|order|verify|appointment/i },
342
+ { kind: "address", severity: "info", key: /address|street|postal|zip_?code|postcode/i, purpose: /address|ship|deliver|checkout|order|store|locat|near|map|direction|tax|shipping|quote|rate/i },
343
+ { kind: "date of birth", severity: "low", key: /\bdob\b|^dob|birth/i, purpose: /birth|age|dob|insur|ticket|regist|account|verif|kyc|passport|visa|travel/i },
344
+ { kind: "government id", severity: "low", key: /\bssn\b|^ssn|social_?security|passport|national_?id|tax_?id|driver'?s?_?licen/i, purpose: /ssn|passport|identity|kyc|verif|visa|travel|tax|licen/i },
345
+ { kind: "payment card or bank", severity: "low", key: /card_?number|\bcard\b|^card|cvv|cvc|\biban\b|^iban|account_?number|routing/i, purpose: /pay|card|bank|checkout|billing|purchase|donat|wallet|refund|iban/i },
346
+ ];
347
+ function piiFindings(tool) {
348
+ const parsed = parseSchema(tool.inputSchema);
349
+ if (!parsed.ok)
350
+ return [];
351
+ const purposeText = `${tool.name} ${tool.title ?? ""} ${tool.description ?? ""}`.replace(/_/g, " ");
352
+ const out = [];
353
+ const reported = new Set();
354
+ for (const p of schemaParams(parsed.value)) {
355
+ for (const k of PII_KINDS) {
356
+ if (!k.key.test(p.key))
357
+ continue;
358
+ // "giftcard_message" is not a card number: require the key to look like a field name for the kind.
359
+ if (k.kind === "payment card or bank" && /gift|discount|business|card_?type|card_?style|rate_?card/i.test(p.key))
360
+ continue;
361
+ if (k.kind === "address" && /e-?mail|ip_?address|wallet/i.test(p.key))
362
+ continue;
363
+ if (k.kind === "date of birth" && /birthstone|birthday_?(?:gift|card|cake|message)/i.test(p.key))
364
+ continue;
365
+ if (k.purpose.test(purposeText))
366
+ continue;
367
+ if (reported.has(k.kind))
368
+ continue;
369
+ reported.add(k.kind);
370
+ out.push({
371
+ id: "WMCP-004",
372
+ severity: k.severity,
373
+ tool: tool.name,
374
+ message: `asks for ${k.kind} (parameter "${p.path}") although its name and description do not need it`,
375
+ });
376
+ }
377
+ }
378
+ return out;
379
+ }
380
+ // ---- WMCP-005: who registered the tool -------------------------------------
381
+ function registrarFindings(tool) {
382
+ const kind = tool.registeredByKind ?? (tool.thirdParty ? "third-party" : undefined);
383
+ if (kind === "library") {
384
+ const pkg = tool.registeredByPackage;
385
+ const host = hostOf(tool.registeredBy);
386
+ const what = pkg ? `library ${pkg} from ${host}` : `a script from the public CDN ${host}`;
387
+ const pin = pkg && isUnpinned(pkg) ? "; the version is not pinned, so the tool text can change without a page change" : "";
388
+ return [{
389
+ id: "WMCP-005",
390
+ severity: "info",
391
+ tool: tool.name,
392
+ message: `registered by ${what} (${tool.registeredBy}); the page chose this library, review its tools as your own${pin}`,
393
+ }];
394
+ }
395
+ if (kind === "third-party") {
396
+ const origin = originOf(tool.registeredBy) ?? tool.registeredBy;
397
+ return [{
398
+ id: "WMCP-005",
399
+ severity: "medium",
400
+ tool: tool.name,
401
+ message: `registered by a script from ${origin}, a different site from the page (${tool.registeredBy}); ` +
402
+ `if ${siteOf(tool.registeredBy) ?? "that domain"} is the site's own asset domain this is first-party, which the audit cannot tell`,
403
+ }];
404
+ }
405
+ return [];
406
+ }
407
+ function hostOf(url) {
408
+ try {
409
+ return new URL(url ?? "").host;
410
+ }
411
+ catch {
412
+ return url ?? "";
413
+ }
414
+ }
415
+ // ---- Per-tool and per-page rules -------------------------------------------
416
+ export function scoreTool(tool) {
417
+ const findings = [];
418
+ findings.push(...poisoningFindings(tool));
419
+ const shape = classifyWriteShape(tool);
420
+ if (shape) {
421
+ if (tool.annotations.readOnlyHint === true) {
422
+ findings.push({
423
+ id: "WMCP-003",
424
+ severity: "high",
425
+ tool: tool.name,
426
+ message: `looks like a write action (${shape.reason}) but is marked readOnlyHint: true`,
427
+ });
428
+ }
429
+ else if (tool.annotations.consequentialHint !== true) {
430
+ findings.push({
431
+ id: "WMCP-002",
432
+ severity: shape.tier,
433
+ tool: tool.name,
434
+ message: `looks like a write action (${shape.reason}) but has no consequentialHint, so agents may run it without asking`,
435
+ });
436
+ }
437
+ }
438
+ findings.push(...piiFindings(tool));
439
+ findings.push(...registrarFindings(tool));
440
+ if ((tool.description ?? "").length > MAX_DESCRIPTION_CHARS) {
441
+ findings.push({
442
+ id: "WMCP-006",
443
+ severity: "low",
444
+ tool: tool.name,
445
+ message: `description is ${tool.description.length} chars (guidance: ${MAX_DESCRIPTION_CHARS} or fewer)`,
446
+ });
447
+ }
448
+ const schema = parseSchema(tool.inputSchema);
449
+ if (tool.inputSchema === undefined || tool.inputSchema === null || tool.inputSchema === "") {
450
+ findings.push({ id: "WMCP-007", severity: "low", tool: tool.name, message: "has no inputSchema" });
451
+ }
452
+ else if (!schema.ok) {
453
+ findings.push({ id: "WMCP-007", severity: "medium", tool: tool.name, message: "inputSchema is not valid JSON" });
454
+ }
455
+ else if (!isPlainObject(schema.value)) {
456
+ findings.push({ id: "WMCP-007", severity: "medium", tool: tool.name, message: "inputSchema is not a JSON Schema object" });
457
+ }
458
+ else if (schema.value.type !== undefined && schema.value.type !== "object") {
459
+ findings.push({
460
+ id: "WMCP-007",
461
+ severity: "low",
462
+ tool: tool.name,
463
+ message: `inputSchema has type "${String(schema.value.type)}"; tool inputs should be type "object"`,
464
+ });
465
+ }
466
+ if (tool.exposedTo && tool.exposedTo.length > 0) {
467
+ findings.push({
468
+ id: "WMCP-009",
469
+ severity: "info",
470
+ tool: tool.name,
471
+ message: `exposed to other origins: ${tool.exposedTo.join(", ")}`,
472
+ });
473
+ }
474
+ return findings;
475
+ }
476
+ export function scorePage(input) {
477
+ const findings = [];
478
+ for (const tool of input.tools)
479
+ findings.push(...scoreTool(tool));
480
+ if (input.tools.length > MAX_TOOLS_PER_PAGE) {
481
+ findings.push({
482
+ id: "WMCP-006",
483
+ severity: "medium",
484
+ tool: null,
485
+ message: `page registers ${input.tools.length} tools (guidance: ${MAX_TOOLS_PER_PAGE} or fewer)`,
486
+ });
487
+ }
488
+ if (input.tools.length > 0 && !/tool|model-?context|webmcp/i.test(input.permissionsPolicy ?? "")) {
489
+ findings.push({
490
+ id: "WMCP-008",
491
+ severity: "info",
492
+ tool: null,
493
+ message: input.permissionsPolicy
494
+ ? "Permissions-Policy does not mention tools; embedded frames inherit the default"
495
+ : "no Permissions-Policy header; embedded frames inherit the default tool policy",
496
+ });
497
+ }
498
+ return findings.sort((a, b) => severityRank(a.severity) - severityRank(b.severity));
499
+ }
500
+ // ---- Summary and verdict ---------------------------------------------------
501
+ /** Same weights as the Tier 1 skill scanner (src/scanner/tier1.ts). */
502
+ const SEVERITY_DEDUCTIONS = {
503
+ critical: 25,
504
+ high: 15,
505
+ medium: 8,
506
+ low: 3,
507
+ info: 0,
508
+ };
509
+ /**
510
+ * Score starts at 100. Each rule deducts per finding, capped at twice the
511
+ * weight of its worst finding, so a site with 30 similar tools is not
512
+ * punished 30 times for one design choice. Thresholds match Tier 1
513
+ * (>= 80 PASS, 50-79 CONCERNS, < 50 FAIL), with two floors: any critical
514
+ * finding is FAIL, and any high finding is at least CONCERNS.
515
+ */
516
+ export function computeVerdict(findings) {
517
+ const byRule = new Map();
518
+ for (const f of findings) {
519
+ const w = SEVERITY_DEDUCTIONS[f.severity];
520
+ const cur = byRule.get(f.id) ?? { total: 0, worst: 0 };
521
+ cur.total += w;
522
+ cur.worst = Math.max(cur.worst, w);
523
+ byRule.set(f.id, cur);
524
+ }
525
+ let score = 100;
526
+ for (const { total, worst } of byRule.values())
527
+ score -= Math.min(total, worst * 2);
528
+ score = Math.max(0, Math.min(100, score));
529
+ let verdict = score >= 80 ? "PASS" : score >= 50 ? "CONCERNS" : "FAIL";
530
+ if (findings.some((f) => f.severity === "critical"))
531
+ verdict = "FAIL";
532
+ else if (verdict === "PASS" && findings.some((f) => f.severity === "high"))
533
+ verdict = "CONCERNS";
534
+ return { score, verdict };
535
+ }
536
+ /** `failed` (the page never loaded and no tool was found) gives score null and verdict ERROR. */
537
+ export function summarize(tools, findings, failed = false) {
538
+ const findingsBySeverity = Object.fromEntries(SEVERITIES.map((s) => [s, 0]));
539
+ for (const f of findings)
540
+ findingsBySeverity[f.severity]++;
541
+ const { score, verdict } = failed ? { score: null, verdict: "ERROR" } : computeVerdict(findings);
542
+ return {
543
+ toolCount: tools.length,
544
+ readOnlyCount: tools.filter((t) => t.annotations.readOnlyHint === true).length,
545
+ consequentialCount: tools.filter((t) => t.annotations.consequentialHint === true).length,
546
+ writeShapedCount: tools.filter((t) => classifyWriteShape(t) !== null).length,
547
+ thirdPartyCount: tools.filter((t) => t.thirdParty).length,
548
+ platformCount: tools.filter((t) => t.registeredByKind === "platform").length,
549
+ libraryCount: tools.filter((t) => t.registeredByKind === "library").length,
550
+ findingsBySeverity,
551
+ score,
552
+ verdict,
553
+ };
554
+ }
555
+ /** Turn an enumeration into the schemaVersion 1 report. */
556
+ export function buildReport(e, scannedAt = new Date()) {
557
+ const findings = scorePage(e);
558
+ const report = {
559
+ schemaVersion: 1,
560
+ url: e.url,
561
+ finalUrl: e.finalUrl,
562
+ scannedAt: scannedAt.toISOString(),
563
+ webmcp: {
564
+ documentModelContext: e.documentModelContext,
565
+ navigatorModelContext: e.navigatorModelContext,
566
+ },
567
+ headers: { permissionsPolicy: e.permissionsPolicy },
568
+ platforms: e.platforms ?? [],
569
+ tools: e.tools,
570
+ findings,
571
+ summary: summarize(e.tools, findings, !!e.error && e.tools.length === 0),
572
+ };
573
+ if (e.error)
574
+ report.error = e.error;
575
+ return report;
576
+ }
577
+ /** Highest severity in a report, or null when there are no findings. */
578
+ export function worstSeverity(findings) {
579
+ let worst = null;
580
+ for (const f of findings) {
581
+ if (worst === null || severityRank(f.severity) < severityRank(worst))
582
+ worst = f.severity;
583
+ }
584
+ return worst;
585
+ }
586
+ //# sourceMappingURL=score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.js","sourceRoot":"","sources":["../../src/webmcp/score.ts"],"names":[],"mappings":"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"}