@extenshi/mcp 0.1.4 → 0.1.5

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/dist/index.js CHANGED
@@ -4,38 +4,31 @@
4
4
  *
5
5
  * Runs locally over stdio inside an MCP client (Claude Code/Desktop, Cursor)
6
6
  * and exposes the Extenshi catalog as tools: market-research reads against the
7
- * public BFF, plus a paid `scan_extension` that reuses the CLI scan path.
7
+ * public BFF, plus a paid `scan_extension` that reuses the CLI scan path, and a
8
+ * local `publish_extension`.
9
+ *
10
+ * The TOOLS themselves live in `tools.ts` (transport-agnostic) so the sibling
11
+ * remote OAuth server (`@extenshi/mcp-server`) reuses the exact same registry.
12
+ * This file is just the stdio wiring: it injects deps that resolve identity
13
+ * from the environment (one `ek_…` key) and enables ALL capabilities.
8
14
  *
9
15
  * Auth: an `ek_…` API key is REQUIRED. Over stdio there are no request headers,
10
16
  * so the key comes from the environment (EXTENSHI_API_KEY) / `~/.extenshi`
11
- * config — see config.ts. Every tool refuses to run without it and points the
12
- * developer at the dedicated key page. The backend independently enforces the
13
- * key, so this is defense in depth, not the only gate.
17
+ * config — see config.ts. The backend independently enforces the key, so this
18
+ * is defense in depth, not the only gate.
14
19
  *
15
20
  * NB: stdout is the MCP protocol channel — never write to it (use stderr).
16
21
  */
17
22
  import { createRequire } from 'node:module';
18
23
  import { FastMCP, UserError } from 'fastmcp';
19
- import { z } from 'zod';
20
24
  import { makeBff } from './bff.js';
21
25
  import { loadConfig } from './config.js';
22
- import { DocsError, getDocsIndex, searchDocs } from './docs.js';
23
- import { PublishSetupError, publishArtifact, readStoreCredentials, validateStoreCredentials, } from './publish.js';
24
- import { checkPublishAccess } from './publish-access.js';
25
- import { ScanError, scanArtifact } from './scan.js';
26
- import { describeStoreConstraints, validateSearchFilters } from './search-filters.js';
27
- import { shapeExtension, shapeSearch, shapeSecurity } from './shape.js';
28
- import { captureError, captureEvent, classifyError, flushTelemetry, initTelemetry } from './telemetry.js';
26
+ import { flushTelemetry, initTelemetry } from './telemetry.js';
27
+ import { MISSING_KEY_MESSAGE, registerTools, SERVER_INSTRUCTIONS, SERVER_NAME, } from './tools.js';
29
28
  import { checkForUpdate } from './update-check.js';
30
29
  const require = createRequire(import.meta.url);
31
30
  const pkg = require('../package.json');
32
31
  initTelemetry({ surface: 'mcp', version: pkg.version });
33
- const KEY_PAGE = 'https://dojo.extenshi.io/api-keys';
34
- const SIGNUP_PAGE = 'https://auth.extenshi.io/signup';
35
- const BILLING_PAGE = 'https://dojo.extenshi.io/billing';
36
- const MISSING_KEY_MESSAGE = 'An Extenshi API key is required. Create one at ' +
37
- `${KEY_PAGE} (sign up first at ${SIGNUP_PAGE} if needed), then set it as the ` +
38
- 'EXTENSHI_API_KEY environment variable in your MCP client config (or run `extenshi login`).';
39
32
  const cfg = loadConfig();
40
33
  /** Return the configured key or refuse with an actionable instruction. */
41
34
  function requireKey() {
@@ -43,473 +36,26 @@ function requireKey() {
43
36
  throw new UserError(MISSING_KEY_MESSAGE);
44
37
  return cfg.apiKey;
45
38
  }
46
- /** Build a BFF client bound to the developer's key (verifies key presence). */
39
+ /** Build a BFF client bound to the developer's env key (verifies key presence). */
47
40
  function bff() {
48
41
  return makeBff(cfg.bffUrl, requireKey());
49
42
  }
50
- /** Normalize a thrown read error into a user-facing message. */
51
- function readError(err) {
52
- if (err instanceof UserError)
53
- throw err;
54
- const message = err instanceof Error ? err.message : String(err);
55
- // A 401 means the BFF rejected the key (enforcement landed / key invalid).
56
- if (/unauthorized|401|api key/i.test(message)) {
57
- throw new UserError(`Request rejected — ${message}\n\n${MISSING_KEY_MESSAGE}`);
58
- }
59
- throw new UserError(message);
60
- }
61
- /**
62
- * Wrap a tool definition so every call emits anonymous telemetry: which tool
63
- * ran, how long it took, and how it failed (coarse error_kind + sanitized
64
- * exception). The generic preserves the Zod-inferred `args` type — `parameters`
65
- * fixes Params, so the inner execute stays as strongly typed as before.
66
- * Fail-soft: telemetry never alters the tool's result or its thrown error.
67
- */
68
- function instrument(tool) {
69
- const { name } = tool;
70
- const original = tool.execute;
71
- return {
72
- ...tool,
73
- execute: async (args, context) => {
74
- const startedAt = Date.now();
75
- captureEvent('mcp_tool_called', { tool: name });
76
- try {
77
- const result = await original(args, context);
78
- captureEvent('mcp_tool_succeeded', { tool: name, duration_ms: Date.now() - startedAt });
79
- return result;
80
- }
81
- catch (err) {
82
- captureEvent('mcp_tool_failed', {
83
- tool: name,
84
- error_kind: classifyError(err),
85
- duration_ms: Date.now() - startedAt,
86
- });
87
- captureError(err, { tool: name });
88
- throw err;
89
- }
90
- },
91
- };
92
- }
93
43
  const server = new FastMCP({
94
- name: 'extenshi',
44
+ name: SERVER_NAME,
95
45
  // FastMCP types `version` as a semver template literal; package.json gives a plain string.
96
46
  version: pkg.version,
97
- instructions: 'Extenshi catalog tools for extension developers: search the cross-store catalog, ' +
98
- 'inspect an extension and its security findings, find competitors, read market stats, ' +
99
- 'run a pre-publish security scan, and publish to the stores. Use search_docs (free, no ' +
100
- 'key) to consult the live product documentation and the @extenshi/cli command reference — ' +
101
- 'prefer quoting exact CLI commands and flags from the docs over guessing. The catalog and ' +
102
- `scan tools require an Extenshi API key (${KEY_PAGE}). Every account gets a free monthly ` +
103
- 'allowance — 25 reads and 5 scans per month; beyond it, buy prepaid credit packs (scans ' +
104
- `and reads, never expire) at ${BILLING_PAGE}.`,
47
+ instructions: SERVER_INSTRUCTIONS,
105
48
  });
106
- // ── Read tools (free; key required) ─────────────────────────────────────────
107
- server.addTool(instrument({
108
- name: 'search_extensions',
109
- description: 'Search the cross-store extension catalog (Chrome, Firefox, Edge) with hybrid relevance. ' +
110
- 'ALL filters are applied server-side by the catalog database — always narrow with the ' +
111
- 'parameters below (rating/users/reviews thresholds, store, category, pricing, risk, ' +
112
- 'permissions, freshness, manifest version, trader status) rather than fetching a broad ' +
113
- 'list and filtering the results yourself. Use `skip` to page through large result sets. ' +
114
- `${describeStoreConstraints()} ` +
115
- 'Returns a compact list for market research and competitive analysis.',
116
- parameters: z.object({
117
- query: z.string().optional().describe('Free-text search query (name, description, keywords).'),
118
- stores: z
119
- .array(z.enum(['CHROME', 'FIREFOX', 'EDGE']))
120
- .optional()
121
- .describe('Limit to stores: CHROME, FIREFOX, and/or EDGE.'),
122
- categories: z.array(z.string()).optional().describe('Catalog category slugs to include.'),
123
- pricing: z
124
- .array(z.enum(['FREE', 'FREEMIUM', 'IN_APP_PURCHASES', 'SUBSCRIPTION']))
125
- .optional()
126
- .describe('Pricing models to include.'),
127
- risk: z
128
- .array(z.enum(['NONE', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL']))
129
- .optional()
130
- .describe('Risk categories to include.'),
131
- permissions: z.array(z.string()).optional().describe('Only extensions requesting these permissions.'),
132
- minRating: z.number().min(0).max(5).optional().describe('Only ratings ≥ this (0–5).'),
133
- maxRating: z.number().min(0).max(5).optional().describe('Only ratings ≤ this (0–5).'),
134
- minWeeklyDownloads: z
135
- .number()
136
- .min(0)
137
- .optional()
138
- .describe('Minimum weekly downloads — FIREFOX-ONLY metric (Chrome/Edge do not report it). ' +
139
- 'For Chrome/Edge popularity use sortBy:"popular" instead. Conflicts with a ' +
140
- 'Chrome/Edge-only `stores` filter and will be rejected.'),
141
- minReviews: z.number().min(0).optional().describe('Minimum number of store reviews/ratings.'),
142
- updatedWithin: z
143
- .enum(['30d', '90d', '1y', 'stale'])
144
- .optional()
145
- .describe('Freshness: updated within 30d / 90d / 1y, or "stale" (older than 1y).'),
146
- manifestVersions: z
147
- .array(z.union([z.literal(2), z.literal(3)]))
148
- .optional()
149
- .describe('Manifest version(s): 2 and/or 3.'),
150
- traderStatuses: z
151
- .array(z.enum(['TRADER', 'NON_TRADER']))
152
- .optional()
153
- .describe('EU DSA trader status.'),
154
- monetizationModels: z
155
- .array(z.enum(['FREE', 'ONE_TIME', 'SUBSCRIPTION', 'FREEMIUM', 'DONATIONS', 'ADS']))
156
- .optional()
157
- .describe('Author-declared monetization model (questionnaire).'),
158
- hasPaywall: z.boolean().optional().describe('Author-declared paywall present.'),
159
- isOpenSource: z.boolean().optional().describe('Author-declared open source.'),
160
- noTelemetry: z.boolean().optional().describe('Author-declared no telemetry.'),
161
- collectsHealthData: z.boolean().optional().describe('Author-declared collects health data.'),
162
- includeDelisted: z
163
- .boolean()
164
- .optional()
165
- .describe('Include extensions whose store listing was removed (default: hidden).'),
166
- sortBy: z
167
- .enum(['relevance', 'popular', 'rating', 'recent', 'name', 'safety', 'trader', 'size'])
168
- .optional()
169
- .describe('Sort field (default: popular, or relevance when a query is given).'),
170
- sortOrder: z.enum(['asc', 'desc']).optional().describe('Sort direction (default: desc).'),
171
- skip: z.number().int().min(0).optional().describe('Offset for pagination (default: 0).'),
172
- limit: z.number().int().min(1).max(25).default(20).describe('Max results to return (1–25).'),
173
- }),
174
- execute: async (args) => {
175
- try {
176
- const conflict = validateSearchFilters(args);
177
- if (conflict)
178
- throw new UserError(conflict);
179
- const limit = args.limit ?? 20;
180
- const result = await bff().searchExtensions({
181
- query: args.query,
182
- stores: args.stores,
183
- categories: args.categories,
184
- pricingModels: args.pricing,
185
- riskCategories: args.risk,
186
- permissions: args.permissions,
187
- minRating: args.minRating,
188
- maxRating: args.maxRating,
189
- minWeeklyDownloads: args.minWeeklyDownloads,
190
- minReviews: args.minReviews,
191
- updatedWithin: args.updatedWithin,
192
- manifestVersions: args.manifestVersions,
193
- traderStatuses: args.traderStatuses,
194
- monetizationModels: args.monetizationModels,
195
- hasPaywall: args.hasPaywall,
196
- isOpenSource: args.isOpenSource,
197
- noTelemetry: args.noTelemetry,
198
- collectsHealthData: args.collectsHealthData,
199
- includeDelisted: args.includeDelisted,
200
- sortBy: args.sortBy ?? (args.query ? 'relevance' : 'popular'),
201
- sortOrder: args.sortOrder,
202
- skip: args.skip,
203
- take: limit,
204
- });
205
- return JSON.stringify(shapeSearch(result, limit), null, 2);
206
- }
207
- catch (err) {
208
- return readError(err);
209
- }
210
- },
211
- }));
212
- server.addTool(instrument({
213
- name: 'get_extension',
214
- description: 'Get full catalog detail for one extension by its numeric catalog ID: metadata, ' +
215
- 'per-store ratings, install counts, categories, and a security badge.',
216
- parameters: z.object({
217
- extension_id: z.number().int().describe('Numeric catalog ID (from search_extensions results).'),
218
- }),
219
- execute: async (args) => {
220
- try {
221
- const result = await bff().getExtensionById(args.extension_id);
222
- if (!result)
223
- throw new UserError(`No extension found with catalog ID ${args.extension_id}.`);
224
- return JSON.stringify(shapeExtension(result), null, 2);
225
- }
226
- catch (err) {
227
- return readError(err);
228
- }
229
- },
230
- }));
231
- server.addTool(instrument({
232
- name: 'get_security',
233
- description: 'Get the security analysis for an extension: safety score (0–100, higher = safer — the ' +
234
- 'same coefficient the website shows), risk category, finding counts by ' +
235
- 'severity, and the top grouped findings (scanner, rule, severity, count). Also returns ' +
236
- 'the install-dialog preview — exactly what Chrome/Firefox show users in the permission ' +
237
- 'prompt at install (consolidated + deduped from the manifest), available even for ' +
238
- 'unscanned extensions. Reads existing scan results — does not trigger a new scan.',
239
- parameters: z.object({
240
- extension_id: z.number().int().describe('Numeric catalog ID.'),
241
- }),
242
- execute: async (args) => {
243
- try {
244
- const client = bff();
245
- // getExtensionById carries `installDialogPreview` (a manifest transform,
246
- // independent of scanning) — fetch it alongside the scan data so the
247
- // security view always includes the install prompt the user would see.
248
- const [security, riskSummary, extension] = await Promise.all([
249
- client.getSecurityData(args.extension_id).catch(() => null),
250
- client.getRiskSummary(args.extension_id).catch(() => null),
251
- client.getExtensionById(args.extension_id).catch(() => null),
252
- ]);
253
- const installDialogPreview = extension && typeof extension === 'object'
254
- ? extension.installDialogPreview
255
- : null;
256
- return JSON.stringify(shapeSecurity(security, riskSummary, installDialogPreview), null, 2);
257
- }
258
- catch (err) {
259
- return readError(err);
260
- }
261
- },
262
- }));
263
- server.addTool(instrument({
264
- name: 'get_related_extensions',
265
- description: 'Find similar/competing extensions for a given extension — useful for competitive ' +
266
- 'analysis and alternatives research.',
267
- parameters: z.object({
268
- extension_id: z.number().int().describe('Numeric catalog ID.'),
269
- limit: z.number().int().min(1).max(12).default(6).describe('Max alternatives to return (1–12).'),
270
- }),
271
- execute: async (args) => {
272
- try {
273
- const result = await bff().getRelatedExtensions(args.extension_id, args.limit ?? 6);
274
- return JSON.stringify(shapeSearch(result, args.limit ?? 6), null, 2);
275
- }
276
- catch (err) {
277
- return readError(err);
278
- }
279
- },
280
- }));
281
- server.addTool(instrument({
282
- name: 'market_overview',
283
- description: 'Aggregate catalog market intelligence. Called with NO arguments it returns a full ' +
284
- 'CATALOG-WIDE overview: totals, store split, the category tree, and the extended facet ' +
285
- 'breakdown — Manifest V2/V3 adoption, sensitive-permission histogram, security risk-tier ' +
286
- 'distribution, trader status, update-recency, and review-count buckets. Pass a `query` ' +
287
- '(and/or store/category filters) to scope those facets to a search result set instead.',
288
- parameters: z.object({
289
- query: z.string().optional().describe('Optional query to scope facets to a search.'),
290
- stores: z.array(z.enum(['CHROME', 'FIREFOX', 'EDGE'])).optional(),
291
- categories: z.array(z.string()).optional(),
292
- }),
293
- execute: async (args) => {
294
- try {
295
- const client = bff();
296
- const scoped = Boolean(args.query?.trim() || args.stores?.length || args.categories?.length);
297
- // Search-scoped: progressive-narrowing facets over the match set.
298
- if (scoped) {
299
- const [stats, facets] = await Promise.all([
300
- client.getStats().catch(() => null),
301
- client
302
- .getSearchFacets({ query: args.query, stores: args.stores, categories: args.categories })
303
- .catch(() => null),
304
- ]);
305
- return JSON.stringify({ scope: 'search', stats: stats ?? undefined, facets: facets ?? undefined }, null, 2);
306
- }
307
- // Catalog-wide: the unscoped search facets are all-zero by design, so build the
308
- // overview from the dedicated catalog-wide procedures (cached server-side).
309
- const STORE_LABELS = {
310
- CHROME: 'Chrome Web Store',
311
- FIREFOX: 'Firefox Add-ons',
312
- EDGE: 'Edge Add-ons',
313
- };
314
- const [stats, extended, categoryTree] = await Promise.all([
315
- client.getStats().catch(() => null),
316
- client.getExtendedFilterFacets().catch(() => null),
317
- client.getCategoryTree().catch(() => null),
318
- ]);
319
- const storeDistribution = stats
320
- ?.storeDistribution ?? [];
321
- const stores = storeDistribution.map((r) => ({
322
- name: r.store,
323
- count: r.count,
324
- label: STORE_LABELS[r.store] ?? r.store,
325
- }));
326
- return JSON.stringify({
327
- scope: 'catalog-wide',
328
- stats: stats ?? undefined,
329
- facets: {
330
- stores,
331
- categoryTree: categoryTree ?? undefined,
332
- extended: extended ?? undefined,
333
- },
334
- note: 'Monetization and download-volume facets are only computed when scoped to a query — pass `query` to get those.',
335
- }, null, 2);
336
- }
337
- catch (err) {
338
- return readError(err);
339
- }
340
- },
341
- }));
342
- // ── Documentation (free; no API key required) ───────────────────────────────
343
- server.addTool(instrument({
344
- name: 'search_docs',
345
- description: 'Search the official Extenshi documentation (docs.extenshi.io) — product guides plus the ' +
346
- 'full @extenshi/cli command reference (scan, review-risk, publish, login). Use it to answer ' +
347
- '"how do I…" questions and to give developers exact CLI commands and flags instead of ' +
348
- 'guessing. Free: reads public docs, no API key or quota required. Omit the query to list ' +
349
- 'every available documentation page.',
350
- parameters: z.object({
351
- query: z
352
- .string()
353
- .optional()
354
- .describe('What to look up, e.g. "scan a zip in CI", "review-risk flags", "publish to edge", "get an API key". Omit to list every page.'),
355
- limit: z
356
- .number()
357
- .int()
358
- .min(1)
359
- .max(10)
360
- .default(4)
361
- .describe('Max documentation sections to return (1–10).'),
362
- }),
363
- execute: async (args) => {
364
- try {
365
- const query = args.query?.trim();
366
- if (!query)
367
- return await getDocsIndex(cfg.docsUrl);
368
- return await searchDocs(cfg.docsUrl, query, args.limit ?? 4);
369
- }
370
- catch (err) {
371
- if (err instanceof DocsError)
372
- throw new UserError(err.message);
373
- throw new UserError(err instanceof Error ? err.message : String(err));
374
- }
375
- },
376
- }));
377
- // ── Action tool (paid; key required) ────────────────────────────────────────
378
- server.addTool(instrument({
379
- name: 'scan_extension',
380
- description: 'Run a pre-publish security scan on a local extension artifact (.zip/.crx/.xpi) and ' +
381
- 'return the report. Uses one scan from your free monthly allowance (5 scans/month) or a ' +
382
- 'purchased scan credit once that runs out. Streams live per-scanner progress.',
383
- parameters: z.object({
384
- artifact_path: z
385
- .string()
386
- .describe('Absolute or relative path to the built extension artifact (≤50 MB).'),
387
- extension_id: z
388
- .number()
389
- .int()
390
- .optional()
391
- .describe('Optional numeric catalog ID to associate the scan with a catalog listing.'),
392
- }),
393
- execute: async (args, { reportProgress }) => {
394
- const apiKey = requireKey();
395
- try {
396
- const report = await scanArtifact({
397
- artifactPath: args.artifact_path,
398
- apiKey,
399
- scanUrl: cfg.scanUrl,
400
- extensionId: args.extension_id?.toString(),
401
- onProgress: (p) => {
402
- if (typeof p.total === 'number' && p.total > 0) {
403
- void reportProgress({ progress: p.completed ?? 0, total: p.total });
404
- }
405
- },
406
- });
407
- return JSON.stringify(shapeExtension(report), null, 2);
408
- }
409
- catch (err) {
410
- if (err instanceof ScanError)
411
- throw new UserError(scanErrorMessage(err));
412
- throw err;
413
- }
414
- },
415
- }));
416
- server.addTool(instrument({
417
- name: 'publish_extension',
418
- description: 'Publish an extension artifact (.zip/.crx/.xpi) to Chrome Web Store, Firefox AMO, and/or Edge Add-ons. ' +
419
- 'FREE and fully local: the upload goes from this machine straight to the store APIs using store ' +
420
- 'credentials from the MCP server environment (CHROME_APP_ID/CHROME_CLIENT_ID/CHROME_CLIENT_SECRET/' +
421
- 'CHROME_REFRESH_TOKEN, FIREFOX_ADDON_GUID/FIREFOX_JWT_ISSUER/FIREFOX_JWT_SECRET, ' +
422
- 'EDGE_PRODUCT_ID/EDGE_CLIENT_ID/EDGE_CLIENT_SECRET/EDGE_TENANT_ID). The upload itself is local, but ' +
423
- 'publishing is in an active testing phase: a quick Extenshi access check runs first (set EXTENSHI_API_KEY ' +
424
- 'so it can recognize your account). Edge submissions are polled to a terminal status. ' +
425
- 'Recommended flow: scan_extension first, then publish.',
426
- parameters: z.object({
427
- artifact_path: z
428
- .string()
429
- .describe('Path to the packaged extension (.zip for Chrome/Edge, .xpi/.zip for Firefox).'),
430
- stores: z
431
- .array(z.enum(['chrome', 'firefox', 'edge']))
432
- .optional()
433
- .describe('Target stores; defaults to every store that has complete credentials in the environment.'),
434
- firefox_artifact_path: z
435
- .string()
436
- .optional()
437
- .describe('Separate Firefox artifact (.xpi); defaults to artifact_path.'),
438
- release_notes: z.string().optional().describe('Release notes for stores that accept them.'),
439
- extension_id: z
440
- .number()
441
- .optional()
442
- .describe('Numeric catalog ID — checks publish-beta access against this specific extension.'),
443
- validate_only: z
444
- .boolean()
445
- .optional()
446
- .describe('Only check which store credentials are configured and valid; publish nothing.'),
447
- }),
448
- execute: async (args, { reportProgress }) => {
449
- try {
450
- if (args.validate_only) {
451
- const checks = await validateStoreCredentials(args.stores);
452
- return JSON.stringify({ checks }, null, 2);
453
- }
454
- // Publish-access gate: `publish` is in an active testing phase. One BFF
455
- // preflight evaluates the `publish-access` PostHog flag for this developer
456
- // / extension. Fails open on any transport error — only a definitive
457
- // server "no" blocks here (see checkPublishAccess).
458
- const creds = readStoreCredentials();
459
- const storeIds = {};
460
- if (creds.chrome)
461
- storeIds.chrome = creds.chrome.appId;
462
- if (creds.firefox)
463
- storeIds.firefox = creds.firefox.addonGuid;
464
- if (creds.edge)
465
- storeIds.edge = creds.edge.productId;
466
- const access = await checkPublishAccess({
467
- bffUrl: cfg.bffUrl,
468
- apiKey: cfg.apiKey,
469
- storeIds,
470
- extensionId: args.extension_id,
471
- });
472
- if (!access.allowed) {
473
- throw new UserError(access.message ??
474
- "Publishing is in an active testing phase and isn't available for your account yet.");
475
- }
476
- void reportProgress({ progress: 0, total: 1 });
477
- const result = await publishArtifact({
478
- artifactPath: args.artifact_path,
479
- stores: args.stores,
480
- firefoxArtifactPath: args.firefox_artifact_path,
481
- releaseNotes: args.release_notes,
482
- });
483
- void reportProgress({ progress: 1, total: 1 });
484
- return JSON.stringify(result, null, 2);
485
- }
486
- catch (err) {
487
- if (err instanceof PublishSetupError)
488
- throw new UserError(err.message);
489
- throw err;
490
- }
491
- },
492
- }));
493
- /** Map a scan backend failure to an actionable next step. */
494
- function scanErrorMessage(err) {
495
- switch (err.status) {
496
- case 401:
497
- return `Authentication failed: ${err.message}\n\n${MISSING_KEY_MESSAGE}`;
498
- case 402:
499
- return `Out of scan credits. Buy a scan pack at ${BILLING_PAGE} — the free allowance (5/mo) resets on the 1st (UTC).`;
500
- case 403:
501
- // FREE_REQUIRES_* came from the pre-credit-pack backend (free scans
502
- // were gated on verified ownership). Kept for skew with old backends.
503
- if (err.errorCode === 'FREE_REQUIRES_CLAIM' || err.errorCode === 'FREE_REQUIRES_VERIFIED_OWNERSHIP') {
504
- return `${err.message}\n\nBuy a scan pack at ${BILLING_PAGE} to scan arbitrary artifacts.`;
505
- }
506
- return `Access denied: ${err.message}`;
507
- case 429:
508
- return `Rate limited — wait ${err.retryAfterSec ?? 60}s before trying again.`;
509
- default:
510
- return err.message;
511
- }
512
- }
49
+ // stdio identity is fixed (env key) — the call context is ignored. ALL four
50
+ // capabilities are enabled: the local client has a filesystem and store creds.
51
+ const stdioDeps = {
52
+ cfg: { bffUrl: cfg.bffUrl, scanUrl: cfg.scanUrl, docsUrl: cfg.docsUrl },
53
+ capabilities: new Set(['read', 'docs', 'scan', 'publish']),
54
+ getBff: () => bff(),
55
+ requireApiKey: () => requireKey(),
56
+ getApiKey: () => cfg.apiKey ?? undefined,
57
+ };
58
+ registerTools(server, stdioDeps);
513
59
  // Flush buffered telemetry on shutdown. 'beforeExit' covers the natural
514
60
  // stdin-closed exit; SIGTERM/SIGINT (the MCP client killing the server) bypass
515
61
  // it, so handle those explicitly and then exit. During a session posthog-node's
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":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAAY,OAAO,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAEN,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,WAAW,GAEX,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAA;AAE7D,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;AAEvD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAA;AAExB,0EAA0E;AAC1E,SAAS,UAAU;IAClB,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAA;IACzD,OAAO,GAAG,CAAC,MAAM,CAAA;AAClB,CAAC;AAED,mFAAmF;AACnF,SAAS,GAAG;IACX,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;IAC1B,IAAI,EAAE,WAAW;IACjB,2FAA2F;IAC3F,OAAO,EAAE,GAAG,CAAC,OAA0C;IACvD,YAAY,EAAE,mBAAmB;CACjC,CAAC,CAAA;AAEF,4EAA4E;AAC5E,+EAA+E;AAC/E,MAAM,SAAS,GAAa;IAC3B,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;IACvE,YAAY,EAAE,IAAI,GAAG,CAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACtE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE;IACnB,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;IACjC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS;CACxC,CAAA;AAED,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAEhC,wEAAwE;AACxE,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,6DAA6D;AAC7D,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAU,EAAE,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACzB,KAAK,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACH,CAAC;AACD,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;IAC/B,KAAK,cAAc,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAA;AAExC,8EAA8E;AAC9E,oEAAoE;AACpE,KAAK,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA"}
package/dist/shape.d.ts CHANGED
@@ -21,10 +21,17 @@ interface CompactOpts {
21
21
  /** Recursively bound a value's size: cap arrays, truncate strings, limit depth. */
22
22
  export declare function compact(value: unknown, opts?: CompactOpts, depth?: number): unknown;
23
23
  type Obj = Record<string, unknown>;
24
- /** Compact a search / related result down to a count + curated items. */
24
+ /** Compact a search result down to a count + curated items. */
25
25
  export declare function shapeSearch(result: unknown, limit: number): Obj;
26
26
  /** Curate a single extension detail (`getExtensionById`). */
27
27
  export declare function shapeExtension(result: unknown): unknown;
28
+ /**
29
+ * Curate a page of store user reviews (`get_reviews`). Passes through the
30
+ * keyset `nextCursor` so the model can page, a `count` for quick sizing, and the
31
+ * store-level `aggregate` (rating / count / snapshot date + reviews link) — the
32
+ * bare facts that stay public even for Chrome.
33
+ */
34
+ export declare function shapeReviews(result: unknown, limit: number): Obj;
28
35
  /**
29
36
  * Curate the install-dialog preview — the consolidated permission prompt the
30
37
  * browser shows at install (computed server-side by catalog-api from the
@@ -1 +1 @@
1
- {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,UAAU,WAAW;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,WAAgB,EAAE,KAAK,SAAI,GAAG,OAAO,CAqBlF;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AA6DlC,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAS/D;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAkCvD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,GAAG,SAAS,CAqBpE;AAkBD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,CAAC,EAAE,OAAO,GAAG,GAAG,CAkD1G"}
1
+ {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,UAAU,WAAW;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,WAAgB,EAAE,KAAK,SAAI,GAAG,OAAO,CAqBlF;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AA6DlC,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAS/D;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAkCvD;AAuDD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAUhE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,GAAG,SAAS,CAqBpE;AAkBD,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,CAAC,EAAE,OAAO,GAAG,GAAG,CAkD1G"}