@trustlists/mcp 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/NOTICE CHANGED
@@ -1,7 +1,7 @@
1
- TrustLists Plugin
2
- Copyright 2026 TrustLists
1
+ trustlists_ Plugin
2
+ Copyright 2026 trustlists
3
3
 
4
- This product includes software developed by TrustLists
4
+ This product includes software developed by trustlists
5
5
  (https://trustlists.org).
6
6
 
7
7
  Licensed under the Apache License, Version 2.0. See LICENSE for details.
package/README.md CHANGED
@@ -1,16 +1,18 @@
1
1
  # @trustlists/mcp
2
2
 
3
- > MCP server that gives AI assistants access to the TrustLists vendor security registry.
3
+ > MCP server that gives AI assistants access to the public trustlists directory.
4
4
 
5
- This is the npm-distributed MCP server that powers the [TrustLists plugin](https://github.com/trustlists/trustlists-plugin) for Cursor, Claude Code, and other Model Context Protocol clients.
5
+ This npm package powers the [trustlists_ plugin](https://github.com/trustlists/trustlists-plugin)
6
+ for Cursor, Claude Code, and other Model Context Protocol clients.
6
7
 
7
8
  ## Installation
8
9
 
9
- You don't install this package directly it's spawned by your MCP-aware AI client.
10
+ You don't install this package directly. It is spawned by your MCP-aware AI client.
10
11
 
11
12
  ### Cursor
12
13
 
13
- The TrustLists plugin handles installation. Or add manually to `~/.cursor/mcp.json`:
14
+ The trustlists_ plugin handles installation. Or add it manually to
15
+ `~/.cursor/mcp.json`:
14
16
 
15
17
  ```json
16
18
  {
@@ -42,12 +44,16 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
42
44
 
43
45
  | Tool | Description |
44
46
  |------|-------------|
45
- | `trustlists_search` | Search 2,000+ trust centers by name or domain |
47
+ | `trustlists_search` | Search thousands of trust centers by name or domain |
46
48
  | `trustlists_lookup` | Look up a single vendor by exact domain |
47
- | `trustlists_audit_dependencies` | Scan project manifests for vendor security posture |
49
+ | `trustlists_browse` | Filter by platform, listed framework, or CSA STAR level |
50
+ | `trustlists_audit_dependencies` | Map project manifests to public vendor trust centers |
48
51
 
49
52
  All tools are free. No authentication required.
50
53
 
54
+ Directory labels show what a public record lists. They do not independently
55
+ prove certification scope, validity, legal compliance, or security quality.
56
+
51
57
  ## Supported manifest formats (audit tool)
52
58
 
53
59
  - `package.json` (npm/yarn/pnpm)
@@ -63,5 +69,6 @@ Apache 2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
63
69
 
64
70
  ## Links
65
71
 
72
+ - [MCP overview and setup](https://trustlists.org/mcp/)
66
73
  - [Plugin source](https://github.com/trustlists/trustlists-plugin)
67
- - [TrustLists Directory](https://trustlists.org)
74
+ - [trustlists directory](https://trustlists.org)
@@ -1,18 +1,19 @@
1
1
  /**
2
- * TrustLists API client.
2
+ * Public trustlists registry client.
3
3
  *
4
- * Wraps calls to the public TrustLists APIs:
5
- * - https://trustlists.org/api/trust-centers.json (registry)
6
- * - https://app.trustlists.org/api/trustlists/lookup (single domain)
7
- * - https://app.trustlists.org/api/trustlists/search (autocomplete)
4
+ * The MCP used to send lookup and search requests through app.trustlists.org.
5
+ * Both endpoints fetched the public directory again on the server. If Vercel's
6
+ * security checkpoint challenged that fetch, the app turned the 429 into a 500
7
+ * and both core MCP tools stopped working.
8
8
  *
9
- * No auth required for any of these. Future paid endpoints (ai-lookup,
10
- * soc2-analyze, request-access) will use Bearer auth tokens stored in
11
- * ~/.trustlists/auth.json.
9
+ * The registry is small enough to fetch once and query locally. We prefer the
10
+ * public site and fail over to the open GitHub data mirror, which removes the
11
+ * app server from the free lookup path and keeps the MCP useful when either
12
+ * public host has a transient problem.
12
13
  */
13
14
  export declare const TRUSTLISTS_REGISTRY_URL = "https://trustlists.org/api/trust-centers.json";
14
- export declare const TRUSTLISTS_LOOKUP_URL = "https://app.trustlists.org/api/trustlists/lookup";
15
- export declare const TRUSTLISTS_SEARCH_URL = "https://app.trustlists.org/api/trustlists/search";
15
+ export declare const TRUSTLISTS_REGISTRY_FALLBACK_URL = "https://raw.githubusercontent.com/trustlists/trustlists-data/main/data/trust-centers.json";
16
+ export declare const TRUSTLISTS_DIRECTORY_URL = "https://trustlists.org";
16
17
  export interface RegistryEntry {
17
18
  name: string;
18
19
  website: string;
@@ -34,35 +35,55 @@ export interface LookupResult {
34
35
  name?: string;
35
36
  trustCenter?: string;
36
37
  website?: string;
38
+ entry?: RegistryEntry;
37
39
  }
38
40
  export interface SearchResult {
39
- source: 'trustlists' | 'brandfetch';
41
+ source: 'trustlists';
40
42
  name: string;
41
43
  domain: string | null;
42
44
  website: string | null;
43
45
  trustCenter?: string;
44
46
  logo?: string | null;
45
47
  certifications?: string[];
46
- qualityScore?: number;
47
- claimed?: boolean;
48
- verified?: boolean;
48
+ platform?: string;
49
+ csaStarLevel?: number;
50
+ lastVerified?: string;
51
+ directoryUrl?: string;
52
+ }
53
+ export interface RegistryInfo {
54
+ source: 'trustlists.org' | 'github';
55
+ sourceUrl: string;
56
+ total: number;
57
+ generated?: string;
58
+ version?: string;
59
+ fetchedAt: string;
60
+ }
61
+ interface RegistrySnapshot {
62
+ entries: RegistryEntry[];
63
+ info: RegistryInfo;
49
64
  }
50
65
  /**
51
- * Fetch the full TrustLists registry. Cached for 10 minutes per process.
66
+ * Fetch the full trustlists registry. Cached for 10 minutes per process.
67
+ * Concurrent cache misses share one refresh request.
52
68
  */
69
+ export declare function getRegistrySnapshot(): Promise<RegistrySnapshot>;
53
70
  export declare function getRegistry(): Promise<RegistryEntry[]>;
54
71
  /**
55
- * Look up a single vendor by exact domain. Uses the lookup endpoint which
56
- * is cheaper than fetching the full registry.
72
+ * Look up a single vendor by exact domain against the local registry snapshot.
57
73
  */
58
74
  export declare function lookupByDomain(domain: string): Promise<LookupResult>;
59
75
  /**
60
- * Autocomplete search across registry + Brandfetch. Used for fuzzy name lookups.
76
+ * Search the public registry by company name or website domain.
61
77
  */
62
78
  export declare function searchVendors(query: string): Promise<SearchResult[]>;
79
+ export declare function searchRegistry(registry: RegistryEntry[], query: string): SearchResult[];
80
+ export declare function formatSearchResult(entry: RegistryEntry, domain?: string): SearchResult;
81
+ export declare function companyDirectoryUrl(name: string): string;
82
+ export declare function resetRegistryCacheForTests(): void;
63
83
  /**
64
84
  * Normalize an arbitrary user input into a bare hostname like 'stripe.com'.
65
85
  * Handles full URLs, www prefixes, trailing paths, and casing.
66
86
  */
67
87
  export declare function normalizeDomain(input: string | undefined | null): string;
88
+ export {};
68
89
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,eAAO,MAAM,uBAAuB,kDAAkD,CAAC;AACvF,eAAO,MAAM,qBAAqB,qDAAqD,CAAC;AACxF,eAAO,MAAM,qBAAqB,qDAAqD,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,GAAG,YAAY,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAuCD;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAS5D;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAc1E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAgB1E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAcxE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,eAAO,MAAM,uBAAuB,kDAAkD,CAAC;AACvF,eAAO,MAAM,gCAAgC,8FACgD,CAAC;AAC9F,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,gBAAgB,GAAG,QAAQ,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAWD,UAAU,gBAAgB;IACxB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,IAAI,EAAE,YAAY,CAAC;CACpB;AAmFD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAYrE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAE5D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAe1E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAI1E;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EAAE,EACzB,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CAkChB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,SAAiC,GACtC,YAAY,CAad;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAcxE"}
@@ -1,97 +1,193 @@
1
1
  /**
2
- * TrustLists API client.
2
+ * Public trustlists registry client.
3
3
  *
4
- * Wraps calls to the public TrustLists APIs:
5
- * - https://trustlists.org/api/trust-centers.json (registry)
6
- * - https://app.trustlists.org/api/trustlists/lookup (single domain)
7
- * - https://app.trustlists.org/api/trustlists/search (autocomplete)
4
+ * The MCP used to send lookup and search requests through app.trustlists.org.
5
+ * Both endpoints fetched the public directory again on the server. If Vercel's
6
+ * security checkpoint challenged that fetch, the app turned the 429 into a 500
7
+ * and both core MCP tools stopped working.
8
8
  *
9
- * No auth required for any of these. Future paid endpoints (ai-lookup,
10
- * soc2-analyze, request-access) will use Bearer auth tokens stored in
11
- * ~/.trustlists/auth.json.
9
+ * The registry is small enough to fetch once and query locally. We prefer the
10
+ * public site and fail over to the open GitHub data mirror, which removes the
11
+ * app server from the free lookup path and keeps the MCP useful when either
12
+ * public host has a transient problem.
12
13
  */
13
- const PLUGIN_VERSION = '0.1.0';
14
- const USER_AGENT = `TrustListsMCP/${PLUGIN_VERSION}`;
15
- const SOURCE_HEADER_VALUE = 'cursor-plugin';
14
+ const PLUGIN_VERSION = '0.2.0';
15
+ const USER_AGENT = `trustlists-mcp/${PLUGIN_VERSION}`;
16
+ const SOURCE_HEADER_VALUE = 'mcp';
17
+ const FETCH_TIMEOUT_MS = 15_000;
16
18
  export const TRUSTLISTS_REGISTRY_URL = 'https://trustlists.org/api/trust-centers.json';
17
- export const TRUSTLISTS_LOOKUP_URL = 'https://app.trustlists.org/api/trustlists/lookup';
18
- export const TRUSTLISTS_SEARCH_URL = 'https://app.trustlists.org/api/trustlists/search';
19
+ export const TRUSTLISTS_REGISTRY_FALLBACK_URL = 'https://raw.githubusercontent.com/trustlists/trustlists-data/main/data/trust-centers.json';
20
+ export const TRUSTLISTS_DIRECTORY_URL = 'https://trustlists.org';
19
21
  const REGISTRY_CACHE_TTL_MS = 10 * 60 * 1000;
20
22
  let registryCache = null;
21
- const LOOKUP_CACHE_TTL_MS = 5 * 60 * 1000;
22
- const lookupCache = new Map();
23
- const SEARCH_CACHE_TTL_MS = 5 * 60 * 1000;
24
- const searchCache = new Map();
23
+ let registryRefresh = null;
25
24
  function defaultHeaders() {
26
25
  return {
27
26
  'User-Agent': USER_AGENT,
28
- 'X-TrustLists-Source': SOURCE_HEADER_VALUE,
29
- 'X-TrustLists-Version': PLUGIN_VERSION,
27
+ 'X-Trustlists-Source': SOURCE_HEADER_VALUE,
28
+ 'X-Trustlists-Version': PLUGIN_VERSION,
30
29
  Accept: 'application/json',
31
30
  };
32
31
  }
33
32
  async function fetchJson(url, init) {
34
- const response = await fetch(url, {
35
- ...init,
36
- headers: {
37
- ...defaultHeaders(),
38
- ...(init?.headers || {}),
39
- },
40
- });
41
- if (!response.ok) {
42
- throw new Error(`TrustLists API error ${response.status} for ${url}`);
33
+ const controller = new AbortController();
34
+ const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
35
+ try {
36
+ const response = await fetch(url, {
37
+ ...init,
38
+ signal: controller.signal,
39
+ headers: {
40
+ ...defaultHeaders(),
41
+ ...(init?.headers || {}),
42
+ },
43
+ });
44
+ if (!response.ok) {
45
+ const mitigated = response.headers.get('x-vercel-mitigated');
46
+ const detail = mitigated ? ` (${mitigated})` : '';
47
+ throw new Error(`trustlists data request returned ${response.status}${detail}`);
48
+ }
49
+ return (await response.json());
50
+ }
51
+ finally {
52
+ clearTimeout(timeout);
43
53
  }
44
- return (await response.json());
54
+ }
55
+ async function refreshRegistrySnapshot() {
56
+ const sources = [
57
+ { source: 'trustlists.org', url: TRUSTLISTS_REGISTRY_URL },
58
+ { source: 'github', url: TRUSTLISTS_REGISTRY_FALLBACK_URL },
59
+ ];
60
+ const failures = [];
61
+ for (const candidate of sources) {
62
+ try {
63
+ const json = await fetchJson(candidate.url);
64
+ const entries = Array.isArray(json?.data) ? json.data : [];
65
+ if (entries.length === 0) {
66
+ throw new Error('registry was empty');
67
+ }
68
+ const snapshot = {
69
+ entries,
70
+ info: {
71
+ source: candidate.source,
72
+ sourceUrl: candidate.url,
73
+ total: Number(json?.meta?.total) || entries.length,
74
+ generated: json?.meta?.generated,
75
+ version: json?.meta?.version,
76
+ fetchedAt: new Date().toISOString(),
77
+ },
78
+ };
79
+ registryCache = {
80
+ value: snapshot,
81
+ expiresAt: Date.now() + REGISTRY_CACHE_TTL_MS,
82
+ };
83
+ return snapshot;
84
+ }
85
+ catch (error) {
86
+ failures.push(`${candidate.source}: ${error instanceof Error ? error.message : String(error)}`);
87
+ }
88
+ }
89
+ throw new Error(`Could not load the public trustlists registry. ${failures.join('; ')}`);
45
90
  }
46
91
  /**
47
- * Fetch the full TrustLists registry. Cached for 10 minutes per process.
92
+ * Fetch the full trustlists registry. Cached for 10 minutes per process.
93
+ * Concurrent cache misses share one refresh request.
48
94
  */
49
- export async function getRegistry() {
50
- const now = Date.now();
51
- if (registryCache && registryCache.expiresAt > now) {
95
+ export async function getRegistrySnapshot() {
96
+ if (registryCache && registryCache.expiresAt > Date.now()) {
52
97
  return registryCache.value;
53
98
  }
54
- const json = await fetchJson(TRUSTLISTS_REGISTRY_URL);
55
- const data = Array.isArray(json?.data) ? json.data : [];
56
- registryCache = { value: data, expiresAt: now + REGISTRY_CACHE_TTL_MS };
57
- return data;
99
+ if (!registryRefresh) {
100
+ registryRefresh = refreshRegistrySnapshot().finally(() => {
101
+ registryRefresh = null;
102
+ });
103
+ }
104
+ return registryRefresh;
105
+ }
106
+ export async function getRegistry() {
107
+ return (await getRegistrySnapshot()).entries;
58
108
  }
59
109
  /**
60
- * Look up a single vendor by exact domain. Uses the lookup endpoint which
61
- * is cheaper than fetching the full registry.
110
+ * Look up a single vendor by exact domain against the local registry snapshot.
62
111
  */
63
112
  export async function lookupByDomain(domain) {
64
113
  const normalized = normalizeDomain(domain);
65
114
  if (!normalized)
66
115
  return { found: false };
67
- const now = Date.now();
68
- const cached = lookupCache.get(normalized);
69
- if (cached && cached.expiresAt > now) {
70
- return cached.value;
71
- }
72
- const url = `${TRUSTLISTS_LOOKUP_URL}?domain=${encodeURIComponent(normalized)}`;
73
- const result = await fetchJson(url);
74
- lookupCache.set(normalized, { value: result, expiresAt: now + LOOKUP_CACHE_TTL_MS });
75
- return result;
116
+ const registry = await getRegistry();
117
+ const entry = registry.find((candidate) => normalizeDomain(candidate.website) === normalized);
118
+ if (!entry)
119
+ return { found: false };
120
+ return {
121
+ found: true,
122
+ name: entry.name,
123
+ trustCenter: entry.trustCenter,
124
+ website: entry.website,
125
+ entry,
126
+ };
76
127
  }
77
128
  /**
78
- * Autocomplete search across registry + Brandfetch. Used for fuzzy name lookups.
129
+ * Search the public registry by company name or website domain.
79
130
  */
80
131
  export async function searchVendors(query) {
81
132
  const trimmed = (query || '').trim();
82
133
  if (trimmed.length < 2)
83
134
  return [];
84
- const cacheKey = trimmed.toLowerCase();
85
- const now = Date.now();
86
- const cached = searchCache.get(cacheKey);
87
- if (cached && cached.expiresAt > now) {
88
- return cached.value;
89
- }
90
- const url = `${TRUSTLISTS_SEARCH_URL}?q=${encodeURIComponent(trimmed)}`;
91
- const json = await fetchJson(url);
92
- const results = Array.isArray(json?.results) ? json.results : [];
93
- searchCache.set(cacheKey, { value: results, expiresAt: now + SEARCH_CACHE_TTL_MS });
94
- return results;
135
+ return searchRegistry(await getRegistry(), trimmed);
136
+ }
137
+ export function searchRegistry(registry, query) {
138
+ const normalizedQuery = query.toLowerCase().trim();
139
+ if (normalizedQuery.length < 2)
140
+ return [];
141
+ return registry
142
+ .map((entry) => {
143
+ const name = String(entry.name || '').toLowerCase();
144
+ const domain = normalizeDomain(entry.website);
145
+ if (!name.includes(normalizedQuery) && !domain.includes(normalizedQuery)) {
146
+ return null;
147
+ }
148
+ let score = 10;
149
+ if (name === normalizedQuery || domain === normalizedQuery)
150
+ score = 200;
151
+ else if (name.startsWith(normalizedQuery) || domain.startsWith(normalizedQuery)) {
152
+ score = 100;
153
+ }
154
+ else if (name.includes(` ${normalizedQuery}`)
155
+ || name.split(/[\s-]/).includes(normalizedQuery)) {
156
+ score = 50;
157
+ }
158
+ score -= Math.abs(name.length - normalizedQuery.length) * 0.5;
159
+ return { entry, domain, score };
160
+ })
161
+ .filter((candidate) => candidate !== null)
162
+ .sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name))
163
+ .map(({ entry, domain }) => formatSearchResult(entry, domain));
164
+ }
165
+ export function formatSearchResult(entry, domain = normalizeDomain(entry.website)) {
166
+ return {
167
+ source: 'trustlists',
168
+ name: entry.name,
169
+ domain: domain || null,
170
+ website: entry.website || null,
171
+ trustCenter: entry.trustCenter,
172
+ certifications: entry.certifications || [],
173
+ platform: entry.platform,
174
+ csaStarLevel: entry.csaStar?.level,
175
+ lastVerified: entry.lastVerified,
176
+ directoryUrl: companyDirectoryUrl(entry.name),
177
+ };
178
+ }
179
+ export function companyDirectoryUrl(name) {
180
+ const slug = String(name || '')
181
+ .toLowerCase()
182
+ .replace(/[^a-z0-9\s-]/g, '')
183
+ .replace(/\s+/g, '-')
184
+ .replace(/-+/g, '-')
185
+ .replace(/^-|-$/g, '');
186
+ return `${TRUSTLISTS_DIRECTORY_URL}/company/${slug}/`;
187
+ }
188
+ export function resetRegistryCacheForTests() {
189
+ registryCache = null;
190
+ registryRefresh = null;
95
191
  }
96
192
  /**
97
193
  * Normalize an arbitrary user input into a bare hostname like 'stripe.com'.
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * TrustLists MCP server entry point.
3
+ * trustlists MCP server entry point.
4
4
  *
5
5
  * Spawned by Cursor / Claude Code via `npx -y @trustlists/mcp`.
6
6
  * Speaks JSON-RPC over stdio per the Model Context Protocol spec.
7
7
  *
8
- * v0.1.0 ships three free tools:
8
+ * v0.2.0 ships four free tools:
9
9
  * - trustlists_search
10
10
  * - trustlists_lookup
11
+ * - trustlists_browse
11
12
  * - trustlists_audit_dependencies
12
13
  *
13
14
  * No auth required for any of these. Future paid endpoints (ai-lookup,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
package/dist/index.js CHANGED
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * TrustLists MCP server entry point.
3
+ * trustlists MCP server entry point.
4
4
  *
5
5
  * Spawned by Cursor / Claude Code via `npx -y @trustlists/mcp`.
6
6
  * Speaks JSON-RPC over stdio per the Model Context Protocol spec.
7
7
  *
8
- * v0.1.0 ships three free tools:
8
+ * v0.2.0 ships four free tools:
9
9
  * - trustlists_search
10
10
  * - trustlists_lookup
11
+ * - trustlists_browse
11
12
  * - trustlists_audit_dependencies
12
13
  *
13
14
  * No auth required for any of these. Future paid endpoints (ai-lookup,
@@ -19,9 +20,10 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
19
20
  import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
20
21
  import { runSearch, searchInputSchema, searchToolDefinition } from './tools/search.js';
21
22
  import { runLookup, lookupInputSchema, lookupToolDefinition } from './tools/lookup.js';
23
+ import { runBrowse, browseInputSchema, browseToolDefinition } from './tools/browse.js';
22
24
  import { runAudit, auditInputSchema, auditToolDefinition, } from './tools/audit-dependencies.js';
23
25
  const SERVER_NAME = 'trustlists';
24
- const SERVER_VERSION = '0.1.0';
26
+ const SERVER_VERSION = '0.2.0';
25
27
  const server = new Server({
26
28
  name: SERVER_NAME,
27
29
  version: SERVER_VERSION,
@@ -31,7 +33,12 @@ const server = new Server({
31
33
  },
32
34
  });
33
35
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
34
- tools: [searchToolDefinition, lookupToolDefinition, auditToolDefinition],
36
+ tools: [
37
+ searchToolDefinition,
38
+ lookupToolDefinition,
39
+ browseToolDefinition,
40
+ auditToolDefinition,
41
+ ],
35
42
  }));
36
43
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
37
44
  const { name, arguments: args } = request.params;
@@ -51,6 +58,13 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
51
58
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
52
59
  };
53
60
  }
61
+ case 'trustlists_browse': {
62
+ const input = browseInputSchema.parse(args ?? {});
63
+ const result = await runBrowse(input);
64
+ return {
65
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
66
+ };
67
+ }
54
68
  case 'trustlists_audit_dependencies': {
55
69
  const input = auditInputSchema.parse(args ?? {});
56
70
  const result = await runAudit(input);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * trustlists_audit_dependencies scan a project's dependency manifests and
2
+ * trustlists_audit_dependencies: scan a project's dependency manifests and
3
3
  * map each dependency to its vendor's trust center.
4
4
  *
5
5
  * Supports:
@@ -10,8 +10,8 @@
10
10
  * - Gemfile (Ruby)
11
11
  * - composer.json (PHP)
12
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.
13
+ * Returns a structured inventory so the host AI (Cursor/Claude) can describe
14
+ * public security-documentation visibility without inventing a risk score.
15
15
  */
16
16
  import { z } from 'zod';
17
17
  export declare const auditInputSchema: z.ZodObject<{
@@ -52,7 +52,7 @@ export interface AuditToolResult {
52
52
  export declare function runAudit(input: AuditInput): Promise<AuditToolResult>;
53
53
  export declare const auditToolDefinition: {
54
54
  readonly name: "trustlists_audit_dependencies";
55
- readonly 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.";
55
+ readonly description: "Scan a project's dependency manifests (package.json, requirements.txt, go.mod, Cargo.toml, Gemfile, composer.json, pyproject.toml, Pipfile) and map likely vendors to public trust center records. Returns documentation-visibility data, not a security score. Use when inventorying third-party services or preparing vendor review.";
56
56
  readonly inputSchema: {
57
57
  readonly type: "object";
58
58
  readonly properties: {
@@ -1 +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"}
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,CAsE1E;AAyaD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;CAmBtB,CAAC"}