@trustlists/mcp 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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-dependencies.d.ts","sourceRoot":"","sources":["../../src/tools/audit-dependencies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB;;;;;;;;;EAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAS1D,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAmE1E;AAyaD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;CAmBtB,CAAC"}
@@ -0,0 +1,500 @@
1
+ /**
2
+ * trustlists_audit_dependencies — scan a project's dependency manifests and
3
+ * map each dependency to its vendor's trust center.
4
+ *
5
+ * Supports:
6
+ * - package.json (npm/yarn/pnpm)
7
+ * - requirements.txt, pyproject.toml, Pipfile (Python)
8
+ * - go.mod (Go)
9
+ * - Cargo.toml (Rust)
10
+ * - Gemfile (Ruby)
11
+ * - composer.json (PHP)
12
+ *
13
+ * Returns a structured audit so the host AI (Cursor/Claude) can produce a
14
+ * risk report without us shipping our own scoring logic.
15
+ */
16
+ import { promises as fs } from 'node:fs';
17
+ import path from 'node:path';
18
+ import { z } from 'zod';
19
+ import { getRegistry, normalizeDomain } from '../api/client.js';
20
+ export const auditInputSchema = z.object({
21
+ projectPath: z.string().min(1, 'projectPath is required'),
22
+ includeDevDependencies: z.boolean().optional().default(false),
23
+ });
24
+ export async function runAudit(input) {
25
+ const projectRoot = path.resolve(input.projectPath);
26
+ const scanners = [
27
+ scanPackageJson,
28
+ scanRequirementsTxt,
29
+ scanPyprojectToml,
30
+ scanPipfile,
31
+ scanGoMod,
32
+ scanCargoToml,
33
+ scanGemfile,
34
+ scanComposerJson,
35
+ ];
36
+ const scannedFiles = [];
37
+ const allDeps = [];
38
+ for (const scanner of scanners) {
39
+ try {
40
+ const result = await scanner(projectRoot, input.includeDevDependencies);
41
+ if (result) {
42
+ scannedFiles.push(result.file);
43
+ allDeps.push(...result.deps);
44
+ }
45
+ }
46
+ catch {
47
+ // skip this scanner; partial scans are better than no scan
48
+ }
49
+ }
50
+ if (scannedFiles.length === 0) {
51
+ return {
52
+ projectPath: projectRoot,
53
+ scannedFiles: [],
54
+ totalDependencies: 0,
55
+ withTrustCenters: 0,
56
+ withoutTrustCenters: 0,
57
+ unknownVendor: 0,
58
+ byManager: {},
59
+ results: [],
60
+ message: `No supported dependency manifests found in ${projectRoot}. Looked for package.json, requirements.txt, pyproject.toml, Pipfile, go.mod, Cargo.toml, Gemfile, composer.json.`,
61
+ };
62
+ }
63
+ const dedupedDeps = dedupeDependencies(allDeps);
64
+ const registry = await getRegistry().catch(() => []);
65
+ const audited = await Promise.all(dedupedDeps.map((dep) => auditDependency(dep, registry)));
66
+ const withTrustCenters = audited.filter((a) => a.hasTrustCenter).length;
67
+ const unknown = audited.filter((a) => a.matchType === 'unknown').length;
68
+ const withoutTrustCenters = audited.length - withTrustCenters;
69
+ const byManager = {};
70
+ for (const dep of audited) {
71
+ byManager[dep.manager] = (byManager[dep.manager] || 0) + 1;
72
+ }
73
+ return {
74
+ projectPath: projectRoot,
75
+ scannedFiles,
76
+ totalDependencies: audited.length,
77
+ withTrustCenters,
78
+ withoutTrustCenters,
79
+ unknownVendor: unknown,
80
+ byManager,
81
+ results: audited,
82
+ message: `Scanned ${scannedFiles.length} manifest${scannedFiles.length === 1 ? '' : 's'}. ${withTrustCenters}/${audited.length} dependencies have trust centers in the TrustLists registry.`,
83
+ };
84
+ }
85
+ function dedupeDependencies(deps) {
86
+ const seen = new Map();
87
+ for (const dep of deps) {
88
+ const key = `${dep.manager}:${dep.name.toLowerCase()}`;
89
+ if (!seen.has(key))
90
+ seen.set(key, dep);
91
+ }
92
+ return Array.from(seen.values());
93
+ }
94
+ async function auditDependency(dep, registry) {
95
+ const candidates = guessVendorDomains(dep.name, dep.manager);
96
+ for (const candidate of candidates) {
97
+ const match = registry.find((entry) => normalizeDomain(entry.website) === candidate);
98
+ if (match) {
99
+ return {
100
+ name: dep.name,
101
+ manager: dep.manager,
102
+ scope: dep.scope,
103
+ vendor: match.name,
104
+ domain: candidate,
105
+ hasTrustCenter: true,
106
+ trustCenter: match.trustCenter,
107
+ platform: match.platform,
108
+ certifications: match.certifications || [],
109
+ csaStarLevel: match.csaStar?.level,
110
+ matchType: candidate === candidates[0] ? 'exact' : 'heuristic',
111
+ };
112
+ }
113
+ }
114
+ return {
115
+ name: dep.name,
116
+ manager: dep.manager,
117
+ scope: dep.scope,
118
+ hasTrustCenter: false,
119
+ certifications: [],
120
+ matchType: 'unknown',
121
+ };
122
+ }
123
+ /**
124
+ * Map a package name to likely vendor domains. The first candidate is the
125
+ * highest-confidence guess; subsequent ones are fallbacks.
126
+ *
127
+ * Examples:
128
+ * "@stripe/stripe-js" → ["stripe.com"] (npm scope === vendor)
129
+ * "@anthropic-ai/sdk" → ["anthropic.com"] (npm scope override)
130
+ * "datadog-api-client" → ["datadoghq.com"] (well-known package override)
131
+ * "boto3" → ["amazon.com"] (well-known package override)
132
+ * "next" → ["vercel.com"] (well-known package override)
133
+ * "github.com/stripe/sdk" → ["stripe.com"] (go module heuristic)
134
+ * "lodash" → [] (no obvious vendor)
135
+ */
136
+ function guessVendorDomains(packageName, manager) {
137
+ const lower = packageName.toLowerCase();
138
+ // 1. Exact package-name overrides (highest confidence).
139
+ const overrides = WELL_KNOWN_VENDOR_DOMAINS[lower];
140
+ if (overrides && overrides.length)
141
+ return overrides;
142
+ const candidates = [];
143
+ if (manager === 'npm' && lower.startsWith('@')) {
144
+ const scope = lower.slice(1).split('/')[0];
145
+ if (scope) {
146
+ // 2. Scope-level overrides for cases where scope ≠ "<vendor>.com"
147
+ // e.g. @anthropic-ai → anthropic.com, @azure → microsoft.com
148
+ const scopeOverride = NPM_SCOPE_OVERRIDES[scope];
149
+ if (scopeOverride) {
150
+ candidates.push(scopeOverride);
151
+ }
152
+ else {
153
+ // 3. Default npm scope heuristic: @stripe/* → stripe.com
154
+ candidates.push(`${scope}.com`);
155
+ }
156
+ }
157
+ }
158
+ // Go: github.com/stripe/stripe-go → stripe.com
159
+ if (manager === 'go' && lower.startsWith('github.com/')) {
160
+ const owner = lower.split('/')[1];
161
+ if (owner) {
162
+ candidates.push(`${owner}.com`);
163
+ candidates.push(`${owner}.io`);
164
+ }
165
+ }
166
+ // Ruby gems: stripe → stripe.com
167
+ if (manager === 'rubygems') {
168
+ candidates.push(`${lower}.com`);
169
+ }
170
+ return [...new Set(candidates)];
171
+ }
172
+ /**
173
+ * Override map for npm scopes whose name doesn't equal "<vendor>.com".
174
+ * These map a scope (without the "@") directly to a vendor domain so all
175
+ * packages under that scope inherit the mapping.
176
+ */
177
+ const NPM_SCOPE_OVERRIDES = {
178
+ // AI / ML
179
+ 'anthropic-ai': 'anthropic.com',
180
+ 'cohere-ai': 'cohere.com',
181
+ mistralai: 'mistral.ai',
182
+ huggingface: 'huggingface.co',
183
+ // Cloud / infra
184
+ azure: 'microsoft.com',
185
+ 'aws-sdk': 'amazon.com',
186
+ 'aws-amplify': 'amazon.com',
187
+ 'google-cloud': 'cloud.google.com',
188
+ 'google-ai': 'cloud.google.com',
189
+ firebase: 'firebase.google.com',
190
+ neondatabase: 'neon.tech',
191
+ planetscale: 'planetscale.com',
192
+ // Auth
193
+ 'workos-inc': 'workos.com',
194
+ 'kinde-oss': 'kinde.com',
195
+ // Communications
196
+ resend: 'resend.com',
197
+ // Databases
198
+ prisma: 'prisma.io',
199
+ // Misc
200
+ octokit: 'github.com',
201
+ brandfetch: 'brandfetch.com',
202
+ mailchimp: 'mailchimp.com',
203
+ vonage: 'vonage.com',
204
+ };
205
+ /**
206
+ * Curated mapping for unscoped or oddly-named packages whose name doesn't
207
+ * obviously match the vendor domain. Keys are lowercased package names.
208
+ *
209
+ * Some entries map to a domain that isn't (yet) in the TrustLists registry —
210
+ * that's fine; the audit will return "unknown" and we'll add to the registry
211
+ * over time.
212
+ */
213
+ const WELL_KNOWN_VENDOR_DOMAINS = {
214
+ // ============================================================
215
+ // AI / ML
216
+ // ============================================================
217
+ openai: ['openai.com'],
218
+ anthropic: ['anthropic.com'],
219
+ cohere: ['cohere.com'],
220
+ replicate: ['replicate.com'],
221
+ // ============================================================
222
+ // Cloud / infrastructure
223
+ // ============================================================
224
+ next: ['vercel.com'],
225
+ vercel: ['vercel.com'],
226
+ netlify: ['netlify.com'],
227
+ cloudflare: ['cloudflare.com'],
228
+ wrangler: ['cloudflare.com'],
229
+ upstash: ['upstash.com'],
230
+ neon: ['neon.tech'],
231
+ supabase: ['supabase.com'],
232
+ 'firebase-admin': ['firebase.google.com'],
233
+ // AWS
234
+ boto3: ['amazon.com'],
235
+ botocore: ['amazon.com'],
236
+ 'aws-sdk': ['amazon.com'],
237
+ 'aws-sdk-js': ['amazon.com'],
238
+ 'aws-amplify': ['amazon.com'],
239
+ 'aws-cdk-lib': ['amazon.com'],
240
+ // ============================================================
241
+ // Auth / identity
242
+ // ============================================================
243
+ 'auth0-js': ['auth0.com'],
244
+ // ============================================================
245
+ // Payments
246
+ // ============================================================
247
+ stripe: ['stripe.com'],
248
+ 'stripe-go': ['stripe.com'],
249
+ braintree: ['braintreepayments.com'],
250
+ // ============================================================
251
+ // Observability / analytics
252
+ // ============================================================
253
+ newrelic: ['newrelic.com'],
254
+ logrocket: ['logrocket.com'],
255
+ fullstory: ['fullstory.com'],
256
+ mixpanel: ['mixpanel.com'],
257
+ 'mixpanel-browser': ['mixpanel.com'],
258
+ amplitude: ['amplitude.com'],
259
+ 'analytics-node': ['segment.com'],
260
+ 'posthog-js': ['posthog.com'],
261
+ 'posthog-node': ['posthog.com'],
262
+ 'datadog-api-client': ['datadoghq.com'],
263
+ 'dd-trace': ['datadoghq.com'],
264
+ 'datadog-lambda-js': ['datadoghq.com'],
265
+ 'sentry-sdk': ['sentry.io'],
266
+ // ============================================================
267
+ // Communications / email / SMS
268
+ // ============================================================
269
+ twilio: ['twilio.com'],
270
+ sendgrid: ['sendgrid.com'],
271
+ postmark: ['postmarkapp.com'],
272
+ resend: ['resend.com'],
273
+ 'mailgun-js': ['mailgun.com'],
274
+ 'mailgun.js': ['mailgun.com'],
275
+ plivo: ['plivo.com'],
276
+ 'discord.js': ['discord.com'],
277
+ // ============================================================
278
+ // Databases / caches / queues
279
+ // ============================================================
280
+ mongodb: ['mongodb.com'],
281
+ mongoose: ['mongodb.com'],
282
+ redis: ['redis.io'],
283
+ ioredis: ['redis.io'],
284
+ fauna: ['fauna.com'],
285
+ faunadb: ['fauna.com'],
286
+ prisma: ['prisma.io'],
287
+ kafkajs: ['confluent.io'],
288
+ 'kafka-node': ['confluent.io'],
289
+ // ============================================================
290
+ // Search
291
+ // ============================================================
292
+ algoliasearch: ['algolia.com'],
293
+ meilisearch: ['meilisearch.com'],
294
+ // ============================================================
295
+ // CMS / marketing / CRM
296
+ // ============================================================
297
+ hubspot: ['hubspot.com'],
298
+ 'intercom-client': ['intercom.com'],
299
+ airtable: ['airtable.com'],
300
+ contentful: ['contentful.com'],
301
+ 'contentful-management': ['contentful.com'],
302
+ sanity: ['sanity.io'],
303
+ // ============================================================
304
+ // Other SaaS
305
+ // ============================================================
306
+ pagerduty: ['pagerduty.com'],
307
+ octokit: ['github.com'],
308
+ };
309
+ // ---------- Manifest scanners ----------
310
+ async function scanPackageJson(root, includeDev) {
311
+ const file = path.join(root, 'package.json');
312
+ const text = await fs.readFile(file, 'utf8');
313
+ const json = JSON.parse(text);
314
+ const deps = [];
315
+ for (const [name, spec] of Object.entries(json.dependencies || {})) {
316
+ deps.push({ name, manager: 'npm', scope: 'runtime', rawSpec: String(spec) });
317
+ }
318
+ if (includeDev) {
319
+ for (const [name, spec] of Object.entries(json.devDependencies || {})) {
320
+ deps.push({ name, manager: 'npm', scope: 'dev', rawSpec: String(spec) });
321
+ }
322
+ }
323
+ for (const [name, spec] of Object.entries(json.peerDependencies || {})) {
324
+ deps.push({ name, manager: 'npm', scope: 'runtime', rawSpec: String(spec) });
325
+ }
326
+ return { file: 'package.json', deps };
327
+ }
328
+ async function scanRequirementsTxt(root, _includeDev) {
329
+ const file = path.join(root, 'requirements.txt');
330
+ const text = await fs.readFile(file, 'utf8');
331
+ const deps = [];
332
+ for (const line of text.split('\n')) {
333
+ const trimmed = line.trim();
334
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-'))
335
+ continue;
336
+ const name = trimmed.split(/[<>=!~\s;]/)[0].toLowerCase();
337
+ if (name)
338
+ deps.push({ name, manager: 'pypi', scope: 'runtime' });
339
+ }
340
+ return { file: 'requirements.txt', deps };
341
+ }
342
+ async function scanPyprojectToml(root, includeDev) {
343
+ const file = path.join(root, 'pyproject.toml');
344
+ const text = await fs.readFile(file, 'utf8');
345
+ const deps = [];
346
+ // Lightweight TOML parsing for [project.dependencies] and [tool.poetry.dependencies].
347
+ const dependencyArray = matchTomlArray(text, /\[project\][\s\S]*?dependencies\s*=\s*\[([\s\S]*?)\]/);
348
+ for (const entry of dependencyArray) {
349
+ const name = entry.replace(/^['"]/, '').split(/[<>=!~\s;]/)[0].toLowerCase();
350
+ if (name)
351
+ deps.push({ name, manager: 'pypi', scope: 'runtime' });
352
+ }
353
+ const poetryRuntime = matchTomlSection(text, /\[tool\.poetry\.dependencies\]([\s\S]*?)(?:\n\[|$)/);
354
+ for (const name of poetryRuntime) {
355
+ if (name === 'python')
356
+ continue;
357
+ deps.push({ name: name.toLowerCase(), manager: 'pypi', scope: 'runtime' });
358
+ }
359
+ if (includeDev) {
360
+ const poetryDev = matchTomlSection(text, /\[tool\.poetry\.dev-dependencies\]([\s\S]*?)(?:\n\[|$)/);
361
+ for (const name of poetryDev) {
362
+ if (name === 'python')
363
+ continue;
364
+ deps.push({ name: name.toLowerCase(), manager: 'pypi', scope: 'dev' });
365
+ }
366
+ }
367
+ return { file: 'pyproject.toml', deps };
368
+ }
369
+ function matchTomlArray(text, pattern) {
370
+ const match = text.match(pattern);
371
+ if (!match || !match[1])
372
+ return [];
373
+ return match[1]
374
+ .split(/,/)
375
+ .map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
376
+ .filter(Boolean);
377
+ }
378
+ function matchTomlSection(text, pattern) {
379
+ const match = text.match(pattern);
380
+ if (!match || !match[1])
381
+ return [];
382
+ const names = [];
383
+ for (const line of match[1].split('\n')) {
384
+ const trimmed = line.trim();
385
+ if (!trimmed || trimmed.startsWith('#'))
386
+ continue;
387
+ const eq = trimmed.indexOf('=');
388
+ if (eq <= 0)
389
+ continue;
390
+ const name = trimmed.slice(0, eq).trim().replace(/^['"]|['"]$/g, '');
391
+ if (name)
392
+ names.push(name);
393
+ }
394
+ return names;
395
+ }
396
+ async function scanPipfile(root, includeDev) {
397
+ const file = path.join(root, 'Pipfile');
398
+ const text = await fs.readFile(file, 'utf8');
399
+ const deps = [];
400
+ const runtime = matchTomlSection(text, /\[packages\]([\s\S]*?)(?:\n\[|$)/);
401
+ for (const name of runtime) {
402
+ deps.push({ name: name.toLowerCase(), manager: 'pypi', scope: 'runtime' });
403
+ }
404
+ if (includeDev) {
405
+ const dev = matchTomlSection(text, /\[dev-packages\]([\s\S]*?)(?:\n\[|$)/);
406
+ for (const name of dev) {
407
+ deps.push({ name: name.toLowerCase(), manager: 'pypi', scope: 'dev' });
408
+ }
409
+ }
410
+ return { file: 'Pipfile', deps };
411
+ }
412
+ async function scanGoMod(root, _includeDev) {
413
+ const file = path.join(root, 'go.mod');
414
+ const text = await fs.readFile(file, 'utf8');
415
+ const deps = [];
416
+ // require ( ... ) blocks and single-line require statements.
417
+ const requireBlock = text.match(/require\s+\(([\s\S]*?)\)/);
418
+ if (requireBlock && requireBlock[1]) {
419
+ for (const line of requireBlock[1].split('\n')) {
420
+ const trimmed = line.trim();
421
+ if (!trimmed || trimmed.startsWith('//'))
422
+ continue;
423
+ const name = trimmed.split(/\s+/)[0];
424
+ if (name)
425
+ deps.push({ name: name.toLowerCase(), manager: 'go', scope: 'runtime' });
426
+ }
427
+ }
428
+ for (const m of text.matchAll(/^require\s+(\S+)\s+\S+/gm)) {
429
+ if (m[1])
430
+ deps.push({ name: m[1].toLowerCase(), manager: 'go', scope: 'runtime' });
431
+ }
432
+ return { file: 'go.mod', deps };
433
+ }
434
+ async function scanCargoToml(root, includeDev) {
435
+ const file = path.join(root, 'Cargo.toml');
436
+ const text = await fs.readFile(file, 'utf8');
437
+ const deps = [];
438
+ const runtime = matchTomlSection(text, /\[dependencies\]([\s\S]*?)(?:\n\[|$)/);
439
+ for (const name of runtime) {
440
+ deps.push({ name: name.toLowerCase(), manager: 'cargo', scope: 'runtime' });
441
+ }
442
+ if (includeDev) {
443
+ const dev = matchTomlSection(text, /\[dev-dependencies\]([\s\S]*?)(?:\n\[|$)/);
444
+ for (const name of dev) {
445
+ deps.push({ name: name.toLowerCase(), manager: 'cargo', scope: 'dev' });
446
+ }
447
+ }
448
+ return { file: 'Cargo.toml', deps };
449
+ }
450
+ async function scanGemfile(root, _includeDev) {
451
+ const file = path.join(root, 'Gemfile');
452
+ const text = await fs.readFile(file, 'utf8');
453
+ const deps = [];
454
+ for (const line of text.split('\n')) {
455
+ const match = line.match(/^\s*gem\s+['"]([^'"]+)['"]/);
456
+ if (match && match[1]) {
457
+ deps.push({ name: match[1].toLowerCase(), manager: 'rubygems', scope: 'runtime' });
458
+ }
459
+ }
460
+ return { file: 'Gemfile', deps };
461
+ }
462
+ async function scanComposerJson(root, includeDev) {
463
+ const file = path.join(root, 'composer.json');
464
+ const text = await fs.readFile(file, 'utf8');
465
+ const json = JSON.parse(text);
466
+ const deps = [];
467
+ for (const name of Object.keys(json.require || {})) {
468
+ if (name === 'php' || name.startsWith('ext-'))
469
+ continue;
470
+ deps.push({ name: name.toLowerCase(), manager: 'composer', scope: 'runtime' });
471
+ }
472
+ if (includeDev) {
473
+ for (const name of Object.keys(json['require-dev'] || {})) {
474
+ if (name === 'php' || name.startsWith('ext-'))
475
+ continue;
476
+ deps.push({ name: name.toLowerCase(), manager: 'composer', scope: 'dev' });
477
+ }
478
+ }
479
+ return { file: 'composer.json', deps };
480
+ }
481
+ export const auditToolDefinition = {
482
+ name: 'trustlists_audit_dependencies',
483
+ description: "Scan a project's dependency manifests (package.json, requirements.txt, go.mod, Cargo.toml, Gemfile, composer.json, pyproject.toml, Pipfile) and map each dependency to its vendor's trust center in the TrustLists registry. Returns structured data for the AI to produce a supply chain risk report. Use when reviewing third-party packages or doing a security audit.",
484
+ inputSchema: {
485
+ type: 'object',
486
+ properties: {
487
+ projectPath: {
488
+ type: 'string',
489
+ description: 'Absolute path to the project root containing dependency manifests.',
490
+ },
491
+ includeDevDependencies: {
492
+ type: 'boolean',
493
+ description: 'If true, include devDependencies / dev-packages / dev-dependencies. Default false.',
494
+ default: false,
495
+ },
496
+ },
497
+ required: ['projectPath'],
498
+ },
499
+ };
500
+ //# sourceMappingURL=audit-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-dependencies.js","sourceRoot":"","sources":["../../src/tools/audit-dependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * trustlists_lookup — exact-domain vendor lookup.
3
+ *
4
+ * Use when you have a domain and want a definitive yes/no answer about whether
5
+ * the vendor publishes a trust center, plus their certifications.
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const lookupInputSchema: z.ZodObject<{
9
+ domain: z.ZodString;
10
+ }, "strip", z.ZodTypeAny, {
11
+ domain: string;
12
+ }, {
13
+ domain: string;
14
+ }>;
15
+ export type LookupInput = z.infer<typeof lookupInputSchema>;
16
+ export interface LookupToolResult {
17
+ found: boolean;
18
+ domain: string;
19
+ result?: {
20
+ name: string;
21
+ website: string;
22
+ trustCenter: string;
23
+ platform?: string;
24
+ certifications: string[];
25
+ csaStarLevel?: number;
26
+ lastVerified?: string;
27
+ };
28
+ message: string;
29
+ }
30
+ export declare function runLookup(input: LookupInput): Promise<LookupToolResult>;
31
+ export declare const lookupToolDefinition: {
32
+ readonly name: "trustlists_lookup";
33
+ readonly description: "Look up a single company in the TrustLists registry by exact domain. Returns trust center URL, platform, certifications, and CSA STAR status if available. Use this when you have a domain and want a definitive answer.";
34
+ readonly inputSchema: {
35
+ readonly type: "object";
36
+ readonly properties: {
37
+ readonly domain: {
38
+ readonly type: "string";
39
+ readonly description: "Domain like \"stripe.com\" or a full URL.";
40
+ };
41
+ };
42
+ readonly required: readonly ["domain"];
43
+ };
44
+ };
45
+ //# sourceMappingURL=lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../../src/tools/lookup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;EAE5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0C7E;AAED,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;CAcvB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * trustlists_lookup — exact-domain vendor lookup.
3
+ *
4
+ * Use when you have a domain and want a definitive yes/no answer about whether
5
+ * the vendor publishes a trust center, plus their certifications.
6
+ */
7
+ import { z } from 'zod';
8
+ import { getRegistry, lookupByDomain, normalizeDomain } from '../api/client.js';
9
+ export const lookupInputSchema = z.object({
10
+ domain: z.string().min(3, 'Domain must be at least 3 characters'),
11
+ });
12
+ export async function runLookup(input) {
13
+ const normalized = normalizeDomain(input.domain);
14
+ if (!normalized) {
15
+ return {
16
+ found: false,
17
+ domain: input.domain,
18
+ message: 'Invalid domain. Provide a hostname like "stripe.com" or a URL.',
19
+ };
20
+ }
21
+ const lookup = await lookupByDomain(normalized);
22
+ if (!lookup.found) {
23
+ return {
24
+ found: false,
25
+ domain: normalized,
26
+ message: `No trust center found for ${normalized} in the public TrustLists registry. The vendor may not publish one, or it may be hosted at a different domain. Consider searching by name with trustlists_search.`,
27
+ };
28
+ }
29
+ let registryEntry;
30
+ try {
31
+ const registry = await getRegistry();
32
+ registryEntry = registry.find((entry) => normalizeDomain(entry.website) === normalized);
33
+ }
34
+ catch {
35
+ registryEntry = undefined;
36
+ }
37
+ return {
38
+ found: true,
39
+ domain: normalized,
40
+ result: {
41
+ name: lookup.name || registryEntry?.name || normalized,
42
+ website: lookup.website || registryEntry?.website || `https://${normalized}`,
43
+ trustCenter: lookup.trustCenter || registryEntry?.trustCenter || '',
44
+ platform: registryEntry?.platform,
45
+ certifications: registryEntry?.certifications || [],
46
+ csaStarLevel: registryEntry?.csaStar?.level,
47
+ lastVerified: registryEntry?.lastVerified,
48
+ },
49
+ message: `Found ${lookup.name} in the TrustLists registry.`,
50
+ };
51
+ }
52
+ export const lookupToolDefinition = {
53
+ name: 'trustlists_lookup',
54
+ description: 'Look up a single company in the TrustLists registry by exact domain. Returns trust center URL, platform, certifications, and CSA STAR status if available. Use this when you have a domain and want a definitive answer.',
55
+ inputSchema: {
56
+ type: 'object',
57
+ properties: {
58
+ domain: {
59
+ type: 'string',
60
+ description: 'Domain like "stripe.com" or a full URL.',
61
+ },
62
+ },
63
+ required: ['domain'],
64
+ },
65
+ };
66
+ //# sourceMappingURL=lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../src/tools/lookup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAsB,MAAM,kBAAkB,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC;CAClE,CAAC,CAAC;AAmBH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAkB;IAChD,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,gEAAgE;SAC1E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,6BAA6B,UAAU,mKAAmK;SACpN,CAAC;IACJ,CAAC;IAED,IAAI,aAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;QACrC,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,aAAa,EAAE,IAAI,IAAI,UAAU;YACtD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,aAAa,EAAE,OAAO,IAAI,WAAW,UAAU,EAAE;YAC5E,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,aAAa,EAAE,WAAW,IAAI,EAAE;YACnE,QAAQ,EAAE,aAAa,EAAE,QAAQ;YACjC,cAAc,EAAE,aAAa,EAAE,cAAc,IAAI,EAAE;YACnD,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK;YAC3C,YAAY,EAAE,aAAa,EAAE,YAAY;SAC1C;QACD,OAAO,EAAE,SAAS,MAAM,CAAC,IAAI,8BAA8B;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,0NAA0N;IAC5N,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACvD;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACO,CAAC"}