@revealui/mcp 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +3 -3
  2. package/dist/author/errors.d.ts +2 -2
  3. package/dist/author/errors.d.ts.map +1 -1
  4. package/dist/author/errors.js +2 -2
  5. package/dist/author/errors.js.map +1 -1
  6. package/dist/author/index.d.ts +1 -1
  7. package/dist/author/index.js +1 -1
  8. package/dist/cli.d.ts +17 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +41 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/index.d.ts +3 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +3 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/oauth.d.ts +2 -52
  17. package/dist/oauth.d.ts.map +1 -1
  18. package/dist/oauth.js +2 -139
  19. package/dist/oauth.js.map +1 -1
  20. package/dist/servers/factories/contracts.d.ts +4 -2
  21. package/dist/servers/factories/contracts.d.ts.map +1 -1
  22. package/dist/servers/factories/contracts.js +0 -2
  23. package/dist/servers/factories/contracts.js.map +1 -1
  24. package/dist/servers/factories/knowledge-graph.d.ts +272 -0
  25. package/dist/servers/factories/knowledge-graph.d.ts.map +1 -0
  26. package/dist/servers/factories/knowledge-graph.js +666 -0
  27. package/dist/servers/factories/knowledge-graph.js.map +1 -0
  28. package/dist/servers/factories/revealui-content.d.ts +126 -0
  29. package/dist/servers/factories/revealui-content.d.ts.map +1 -1
  30. package/dist/servers/factories/revealui-content.js +279 -63
  31. package/dist/servers/factories/revealui-content.js.map +1 -1
  32. package/dist/servers/revealui-memory.d.ts +2 -2
  33. package/dist/streamable-http.d.ts +25 -2
  34. package/dist/streamable-http.d.ts.map +1 -1
  35. package/dist/streamable-http.js +16 -1
  36. package/dist/streamable-http.js.map +1 -1
  37. package/package.json +26 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../../../src/servers/factories/knowledge-graph.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,94 @@
33
33
  */
34
34
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
35
35
  import { z } from 'zod/v4';
36
+ /** Resolved REST credentials for one tool call. */
37
+ export interface ResolvedApiCredentials {
38
+ apiUrl: string;
39
+ apiKey: string;
40
+ }
41
+ /**
42
+ * Per-request context handed to the governed seams. Derived from the MCP
43
+ * request handler's `extra` (the transport threads `authInfo` from the
44
+ * authenticated HTTP request; `sessionId` is the routing key). `undefined`
45
+ * on the stdio path.
46
+ */
47
+ export interface McpToolCallContext {
48
+ authInfo?: unknown;
49
+ sessionId?: string;
50
+ }
51
+ /**
52
+ * Governed-path credential resolver. Returns the credentials to forward for a
53
+ * single tool call — on the governed path, the caller's own bearer token so
54
+ * the REST layer enforces `access.read` against the real user. May throw /
55
+ * reject when no per-request credential exists; the call then fails closed.
56
+ */
57
+ export type CredentialsProvider = (ctx: McpToolCallContext) => Promise<ResolvedApiCredentials> | ResolvedApiCredentials;
58
+ /** Terminal outcome of a governed tool call, as recorded in the receipt. */
59
+ export type McpToolAuditOutcome = 'invoked' | 'denied' | 'failed';
60
+ /**
61
+ * A governed tool-call receipt. Raw arguments are NEVER included — only a
62
+ * sha256 digest of the canonical JSON plus an allowlisted scalar subset
63
+ * (`collection`, `site_id`) that is safe to store in the clear.
64
+ */
65
+ export interface McpToolAuditRecord {
66
+ outcome: McpToolAuditOutcome;
67
+ tool: string;
68
+ /** sha256 (hex) of the canonical JSON of the raw arguments. */
69
+ argsDigest: string;
70
+ /** Allowlisted non-secret identifiers pulled from the validated args. */
71
+ scalars: Record<string, string>;
72
+ durationMs: number;
73
+ httpStatus?: number;
74
+ /**
75
+ * Why a call was denied, when `outcome === 'denied'`. `'authz'` for a
76
+ * deny-by-default tool-permission miss (I-7); `'rate-limit'` when the
77
+ * per-user quota is exhausted (I-8). Absent for a validation/unknown-tool
78
+ * denial and for non-denied outcomes.
79
+ */
80
+ reason?: string;
81
+ /** The MCP client that connected (from the `initialize` handshake). */
82
+ clientInfo?: {
83
+ name: string;
84
+ version: string;
85
+ };
86
+ context: McpToolCallContext;
87
+ }
88
+ /**
89
+ * Governed-path audit sink. Resolves when the receipt is durably written;
90
+ * rejects when the write failed. For a mutating tool a rejection fails the
91
+ * call (fail-closed); for a read tool it degrades to log-and-continue.
92
+ */
93
+ export type McpToolAuditSink = (record: McpToolAuditRecord) => Promise<void>;
94
+ /**
95
+ * Deny-by-default per-tool authorization gate (GAP-371 Phase 2, I-7). Returns
96
+ * true iff the identity threaded through `ctx.authInfo` may execute `toolName`
97
+ * at its server-derived tier and role. Governs BOTH `tools/list` filtering and
98
+ * `tools/call` execution — a tool absent from the list is still independently
99
+ * denied on a direct call. Absent on the stdio path (every tool allowed).
100
+ */
101
+ export type McpToolAuthorizer = (ctx: McpToolCallContext, toolName: string) => boolean;
102
+ /**
103
+ * Per-call rate-limit gate (GAP-371 Phase 2, I-8). Consumed once per authorized
104
+ * `tools/call`, keyed by the caller's user + tool with limits from the
105
+ * server-derived tier. Returns false when the quota is exhausted. Absent on the
106
+ * stdio path (unlimited). Never consumed for `tools/list` or for a denied call.
107
+ */
108
+ export type McpToolRateLimiter = (ctx: McpToolCallContext, toolName: string) => Promise<boolean> | boolean;
109
+ /** One usage-meter event, emitted once per EXECUTED tool call (I-8 tail). */
110
+ export interface McpToolMeterEvent {
111
+ tool: string;
112
+ durationMs: number;
113
+ /** True when the tool surfaced an error (bad args reaching the backend, throw, non-2xx). */
114
+ errored: boolean;
115
+ }
116
+ /**
117
+ * Usage-meter sink (GAP-371 Phase 2). Fired once per tool call that actually
118
+ * executed (success or failure) — never for an authz/rate-limit denial, which
119
+ * are audit events, not billable usage. Sink errors are swallowed: metering
120
+ * must never break the underlying tool call. Billing and audit are separate
121
+ * sinks by design.
122
+ */
123
+ export type McpToolMeterSink = (ctx: McpToolCallContext, event: McpToolMeterEvent) => void | Promise<void>;
36
124
  /**
37
125
  * Set credential overrides for this server. Called by the hypervisor with
38
126
  * resolved tenant credentials (or by an HTTP launcher before handing the
@@ -98,6 +186,44 @@ export interface CreateRevealuiContentServerOptions {
98
186
  * directly; out-of-process subprocess consumers leave it unset.
99
187
  */
100
188
  collectionsProvider?: CollectionsProvider;
189
+ /**
190
+ * Governed-path (GAP-371) per-request credential resolver. When set, it is
191
+ * the SOLE source of tool-call credentials — the `REVEALUI_API_KEY` /
192
+ * `setCredentials()` fallback is never consulted (invariant I-4). Leave
193
+ * unset for the stdio launcher to keep the process-global env-key model.
194
+ */
195
+ credentialsProvider?: CredentialsProvider;
196
+ /**
197
+ * Governed-path audit sink. When set, every `tools/call` produces a receipt
198
+ * (invariant I-5). Mutating tools (see `mutatingTools`) fail closed if the
199
+ * receipt cannot be written; read tools degrade to log-and-continue.
200
+ */
201
+ auditSink?: McpToolAuditSink;
202
+ /**
203
+ * Names of tools that mutate state and therefore require a durable receipt
204
+ * BEFORE they run. Phase 1 exposes read tools only, so this is empty in
205
+ * production; it exists so Phase 2 write tools inherit the fail-closed path
206
+ * (and so the branch is testable now with a simulated mutating tool).
207
+ */
208
+ mutatingTools?: ReadonlySet<string>;
209
+ /**
210
+ * Governed-path deny-by-default per-tool authorization (I-7). When set, it
211
+ * gates BOTH `tools/list` (advertised set) and `tools/call` (execution). A
212
+ * tool the caller may not execute is neither listed nor callable. Leave unset
213
+ * for the stdio launcher (no per-tool authz — the OS account is the boundary).
214
+ */
215
+ toolAuthorizer?: McpToolAuthorizer;
216
+ /**
217
+ * Governed-path per-call rate limiter (I-8). When set, an authorized
218
+ * `tools/call` consumes one token; exhaustion yields a JSON-RPC error and a
219
+ * `mcp:tool:denied` receipt with `reason: 'rate-limit'`. Unset → unlimited.
220
+ */
221
+ rateLimiter?: McpToolRateLimiter;
222
+ /**
223
+ * Governed-path usage-meter sink. When set, one meter event fires per
224
+ * executed tool call (source `agent` downstream). Unset → no metering.
225
+ */
226
+ meterSink?: McpToolMeterSink;
101
227
  }
102
228
  /**
103
229
  * Create a fresh `revealui-content` MCP Server instance. Safe to call
@@ -1 +1 @@
1
- {"version":3,"file":"revealui-content.d.ts","sourceRoot":"","sources":["../../../src/servers/factories/revealui-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAWnE,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAS3B;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAElE;AAiDD,eAAO,MAAM,mBAAmB;;;kBAKrB,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;kBAQvB,CAAC;AAEZ,eAAO,MAAM,oBAAoB;;;kBAKtB,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;;;kBAMrB,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;kBAIrB,CAAC;AAuFZ;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CAAC;AAE/E,MAAM,WAAW,kCAAkC;IACjD;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAuID;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,MAAM,CA6NhG"}
1
+ {"version":3,"file":"revealui-content.d.ts","sourceRoot":"","sources":["../../../src/servers/factories/revealui-content.ts"],"names":[],"mappings":"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"}
@@ -31,10 +31,42 @@
31
31
  * via `setCredentials()`. Falls back to `REVEALUI_API_URL` +
32
32
  * `REVEALUI_API_KEY` env vars when no override is set.
33
33
  */
34
+ import { createHash } from 'node:crypto';
34
35
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
35
36
  import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
36
37
  import { z } from 'zod/v4';
37
38
  import { validateToolArgs } from '../../validate-tool-args.js';
39
+ /** sha256 (hex) of the canonical JSON of an arbitrary argument object. */
40
+ function digestArgs(args) {
41
+ return createHash('sha256').update(canonicalJson(args)).digest('hex');
42
+ }
43
+ /**
44
+ * Deterministic JSON with object keys sorted, so the digest of the same
45
+ * logical arguments is stable regardless of key order. No regex; a manual
46
+ * recursive serializer over the parsed value.
47
+ */
48
+ function canonicalJson(value) {
49
+ if (value === null || typeof value !== 'object')
50
+ return JSON.stringify(value) ?? 'null';
51
+ if (Array.isArray(value))
52
+ return `[${value.map(canonicalJson).join(',')}]`;
53
+ const entries = Object.entries(value).sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0);
54
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(',')}}`;
55
+ }
56
+ /** Allowlisted, non-secret scalars safe to store in a receipt in the clear. */
57
+ const AUDIT_SCALAR_ALLOWLIST = ['collection', 'site_id'];
58
+ function pickAuditScalars(args) {
59
+ const out = {};
60
+ if (!args || typeof args !== 'object')
61
+ return out;
62
+ const record = args;
63
+ for (const key of AUDIT_SCALAR_ALLOWLIST) {
64
+ const raw = record[key];
65
+ if (typeof raw === 'string' && raw.length > 0)
66
+ out[key] = raw;
67
+ }
68
+ return out;
69
+ }
38
70
  // ---------------------------------------------------------------------------
39
71
  // Credential overrides (set by hypervisor / HTTP launcher)
40
72
  // ---------------------------------------------------------------------------
@@ -77,9 +109,9 @@ async function apiGet(baseUrl, apiKey, path, params) {
77
109
  const res = await fetch(url.toString(), { headers: apiHeaders(apiKey) });
78
110
  const body = await res.json();
79
111
  if (!res.ok) {
80
- throw new Error(body.error ??
112
+ throw new ApiRequestError(body.error ??
81
113
  body.message ??
82
- `API ${res.status}`);
114
+ `API ${res.status}`, res.status);
83
115
  }
84
116
  return body;
85
117
  }
@@ -195,6 +227,15 @@ const TOOLS = [
195
227
  },
196
228
  },
197
229
  ];
230
+ /** Error carrying the upstream HTTP status, for audit `httpStatus`. */
231
+ class ApiRequestError extends Error {
232
+ status;
233
+ constructor(message, status) {
234
+ super(message);
235
+ this.status = status;
236
+ this.name = 'ApiRequestError';
237
+ }
238
+ }
198
239
  /**
199
240
  * Curated fallback used when neither an injected provider nor HTTP
200
241
  * introspection is available. These four collections exist in every admin
@@ -328,7 +369,15 @@ async function fetchCollectionsFromAdmin(apiUrl, apiKey) {
328
369
  * consume this factory; the factory itself is transport-agnostic.
329
370
  */
330
371
  export function createRevealuiContentServer(options) {
331
- const server = new Server({ name: 'revealui-content', version: '1.0.0' }, { capabilities: { tools: {}, resources: {} } });
372
+ // A `credentialsProvider` marks the governed/hosted mount (`/api/mcp`). On
373
+ // that path Phase 1 exposes ONLY the five read tools (design §4-D): the
374
+ // resource handlers below resolve the ambient service credential rather than
375
+ // the caller's token and write no receipt, so on a multi-tenant mount they
376
+ // would be a cross-tenant, unaudited read channel. The capability is therefore
377
+ // structurally absent when governed — not merely credential-gated. The stdio /
378
+ // local mount (no options) keeps resources unchanged (single-operator trust).
379
+ const governed = options?.credentialsProvider !== undefined;
380
+ const server = new Server({ name: 'revealui-content', version: '1.0.0' }, { capabilities: governed ? { tools: {} } : { tools: {}, resources: {} } });
332
381
  // Per-server memoization: resolve the effective collection set once and
333
382
  // reuse across `resources/list` + `resources/read` for the lifetime of the
334
383
  // server instance. Avoids double-fetching on every read.
@@ -357,80 +406,232 @@ export function createRevealuiContentServer(options) {
357
406
  cachedCollections = [...CURATED_FALLBACK];
358
407
  return cachedCollections;
359
408
  }
360
- server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
409
+ server.setRequestHandler(ListToolsRequestSchema, async (_request, extra) => {
410
+ const authorizer = options?.toolAuthorizer;
411
+ if (!authorizer)
412
+ return { tools: TOOLS };
413
+ // Filtered discovery (I-7): advertise only tools this caller may execute.
414
+ // This is UX; execution authz below is the security control — a tool hidden
415
+ // here is still independently denied on a direct `tools/call`.
416
+ const ctx = {
417
+ authInfo: extra?.authInfo,
418
+ sessionId: extra?.sessionId,
419
+ };
420
+ return { tools: TOOLS.filter((tool) => authorizer(ctx, tool.name)) };
421
+ });
361
422
  // -------------------------------------------------------------------------
362
423
  // Resources (Stage 4.1 + 4.2)
424
+ //
425
+ // Registered ONLY on the ungoverned (stdio / local) path. These handlers use
426
+ // the process-global `resolveCredentials()` and emit no receipt, so on the
427
+ // governed mount they are omitted entirely (see capability gate above,
428
+ // design §4-D). The guard and the capability advertisement must stay in
429
+ // lockstep: a registered handler with no advertised capability, or vice
430
+ // versa, reintroduces the bypass.
363
431
  // -------------------------------------------------------------------------
364
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
365
- const { apiUrl, apiKey } = resolveCredentials();
366
- if (!(apiUrl && apiKey)) {
367
- // Without credentials the server can't enumerate rows; advertise an
368
- // empty list rather than erroring clients still see the resources
369
- // capability and can retry once creds are set.
370
- return { resources: [] };
432
+ if (!governed) {
433
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
434
+ const { apiUrl, apiKey } = resolveCredentials();
435
+ if (!(apiUrl && apiKey)) {
436
+ // Without credentials the server can't enumerate rows; advertise an
437
+ // empty list rather than erroring clients still see the resources
438
+ // capability and can retry once creds are set.
439
+ return { resources: [] };
440
+ }
441
+ const collections = await resolveCollections();
442
+ const resources = [];
443
+ for (const collection of collections) {
444
+ try {
445
+ const body = await apiGet(apiUrl, apiKey, `/api/${collection.slug}`, {
446
+ limit: String(DEFAULT_RESOURCE_PAGE_SIZE),
447
+ page: '1',
448
+ });
449
+ for (const row of extractDocs(body)) {
450
+ resources.push(resourceForRow(collection, row));
451
+ }
452
+ }
453
+ catch {
454
+ // empty-catch-ok: an unavailable collection shouldn't blank-out the entire resource list
455
+ }
456
+ }
457
+ return { resources };
458
+ });
459
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
460
+ const parsed = parseResourceUri(request.params.uri);
461
+ if (!parsed) {
462
+ throw new Error(`Unknown resource URI (expected ${RESOURCE_URI_PREFIX}<collection>/<id>): ${request.params.uri}`);
463
+ }
464
+ const collections = await resolveCollections();
465
+ const collection = collections.find((c) => c.slug === parsed.collection);
466
+ if (!collection) {
467
+ throw new Error(`Collection is not exposed as a resource: ${parsed.collection}`);
468
+ }
469
+ const { apiUrl, apiKey } = resolveCredentials();
470
+ if (!(apiUrl && apiKey)) {
471
+ throw new Error('REVEALUI_API_URL and REVEALUI_API_KEY must be set');
472
+ }
473
+ const row = await apiGet(apiUrl, apiKey, `/api/${parsed.collection}/${parsed.id}`);
474
+ return {
475
+ contents: [
476
+ {
477
+ uri: request.params.uri,
478
+ mimeType: 'application/json',
479
+ text: JSON.stringify(row, null, 2),
480
+ },
481
+ ],
482
+ };
483
+ });
484
+ }
485
+ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
486
+ const startTime = Date.now();
487
+ const toolName = request.params.name;
488
+ const rawArgs = request.params.arguments;
489
+ const ctx = {
490
+ authInfo: extra?.authInfo,
491
+ sessionId: extra?.sessionId,
492
+ };
493
+ const auditSink = options?.auditSink;
494
+ const mutating = options?.mutatingTools?.has(toolName) ?? false;
495
+ // Write a receipt for this call. Returns whether the write succeeded; the
496
+ // sink itself classifies + logs a failure, so callers only decide between
497
+ // fail-closed (mutations) and degrade (reads). No-op when no sink is wired
498
+ // (the stdio path).
499
+ async function writeReceipt(outcome, opts) {
500
+ if (!auditSink)
501
+ return true;
502
+ const client = server.getClientVersion();
503
+ const record = {
504
+ outcome,
505
+ tool: toolName,
506
+ argsDigest: digestArgs(rawArgs ?? null),
507
+ scalars: pickAuditScalars(rawArgs),
508
+ durationMs: Date.now() - startTime,
509
+ httpStatus: opts?.httpStatus,
510
+ reason: opts?.reason,
511
+ clientInfo: client ? { name: client.name, version: client.version } : undefined,
512
+ context: ctx,
513
+ };
514
+ try {
515
+ await auditSink(record);
516
+ return true;
517
+ }
518
+ catch {
519
+ return false;
520
+ }
371
521
  }
372
- const collections = await resolveCollections();
373
- const resources = [];
374
- for (const collection of collections) {
522
+ // A call rejected before it executes (unknown tool, invalid args, authz or
523
+ // rate-limit denial). Records a `denied` receipt (best-effort — a denial
524
+ // that mutates nothing degrades like a read) and returns the client error.
525
+ async function denied(response, reason) {
526
+ await writeReceipt('denied', reason ? { reason } : undefined);
527
+ return response;
528
+ }
529
+ // Deny-by-default collection allowlist. The content tools interpolate the
530
+ // `collection` arg into `/api/<collection>`, so a free-string collection
531
+ // would let one tool reach another tool's endpoint (e.g. `/api/users`,
532
+ // bypassing the admin gate on `revealui_list_users`). A collection outside
533
+ // the RESOLVED exposed set is denied before any REST call — the backend is
534
+ // never reached for an unexposed collection.
535
+ async function denyIfCollectionNotExposed(collection) {
536
+ const exposed = await resolveCollections();
537
+ const slugs = new Set(exposed.map((c) => c.slug));
538
+ if (slugs.has(collection))
539
+ return null;
540
+ return denied({
541
+ content: [{ type: 'text', text: `Error: collection is not exposed: ${collection}` }],
542
+ isError: true,
543
+ }, 'collection-not-exposed');
544
+ }
545
+ // Emit one usage-meter event for a call that actually executed. Swallows
546
+ // sink errors so metering can never break the tool call.
547
+ async function fireMeter(errored) {
548
+ if (!options?.meterSink)
549
+ return;
375
550
  try {
376
- const body = await apiGet(apiUrl, apiKey, `/api/${collection.slug}`, {
377
- limit: String(DEFAULT_RESOURCE_PAGE_SIZE),
378
- page: '1',
551
+ await options.meterSink(ctx, {
552
+ tool: toolName,
553
+ durationMs: Date.now() - startTime,
554
+ errored,
379
555
  });
380
- for (const row of extractDocs(body)) {
381
- resources.push(resourceForRow(collection, row));
382
- }
383
556
  }
384
557
  catch {
385
- // empty-catch-ok: an unavailable collection shouldn't blank-out the entire resource list
558
+ // empty-catch-ok: metering is best-effort and must not affect the call
386
559
  }
387
560
  }
388
- return { resources };
389
- });
390
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
391
- const parsed = parseResourceUri(request.params.uri);
392
- if (!parsed) {
393
- throw new Error(`Unknown resource URI (expected ${RESOURCE_URI_PREFIX}<collection>/<id>): ${request.params.uri}`);
561
+ // Deny-by-default per-tool authorization (I-7). Runs before credentials are
562
+ // resolved, so an unauthorized caller never triggers a credential lookup or
563
+ // a REST call. A tool hidden from `tools/list` is still denied here.
564
+ if (options?.toolAuthorizer && !options.toolAuthorizer(ctx, toolName)) {
565
+ return denied({
566
+ content: [{ type: 'text', text: `Error: not authorized to call tool: ${toolName}` }],
567
+ isError: true,
568
+ }, 'authz');
394
569
  }
395
- const collections = await resolveCollections();
396
- const collection = collections.find((c) => c.slug === parsed.collection);
397
- if (!collection) {
398
- throw new Error(`Collection is not exposed as a resource: ${parsed.collection}`);
570
+ // Per-user + tier rate limit (I-8). Consumed only for an authorized call,
571
+ // before any credential resolution or execution. A denial is audited with
572
+ // `reason: 'rate-limit'` and never meters (a rejected call is not usage).
573
+ if (options?.rateLimiter) {
574
+ const allowed = await options.rateLimiter(ctx, toolName);
575
+ if (!allowed) {
576
+ return denied({
577
+ content: [{ type: 'text', text: `Error: rate limit exceeded for tool: ${toolName}` }],
578
+ isError: true,
579
+ }, 'rate-limit');
580
+ }
399
581
  }
400
- const { apiUrl, apiKey } = resolveCredentials();
401
- if (!(apiUrl && apiKey)) {
402
- throw new Error('REVEALUI_API_URL and REVEALUI_API_KEY must be set');
582
+ // Resolve credentials. Governed path: the injected provider is the sole
583
+ // source and may throw when no per-request credential exists (I-4). Env
584
+ // path is unchanged for stdio.
585
+ let apiUrl;
586
+ let apiKey;
587
+ try {
588
+ if (options?.credentialsProvider) {
589
+ const resolved = await options.credentialsProvider(ctx);
590
+ apiUrl = resolved.apiUrl;
591
+ apiKey = resolved.apiKey;
592
+ }
593
+ else {
594
+ const resolved = resolveCredentials();
595
+ if (!(resolved.apiUrl && resolved.apiKey)) {
596
+ return {
597
+ content: [
598
+ { type: 'text', text: 'Error: REVEALUI_API_URL and REVEALUI_API_KEY must be set' },
599
+ ],
600
+ isError: true,
601
+ };
602
+ }
603
+ apiUrl = resolved.apiUrl;
604
+ apiKey = resolved.apiKey;
605
+ }
403
606
  }
404
- const row = await apiGet(apiUrl, apiKey, `/api/${parsed.collection}/${parsed.id}`);
405
- return {
406
- contents: [
407
- {
408
- uri: request.params.uri,
409
- mimeType: 'application/json',
410
- text: JSON.stringify(row, null, 2),
411
- },
412
- ],
413
- };
414
- });
415
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
416
- const startTime = Date.now();
417
- const toolName = request.params.name;
418
- const { apiUrl, apiKey } = resolveCredentials();
419
- if (!(apiUrl && apiKey)) {
607
+ catch (err) {
608
+ await writeReceipt('failed');
420
609
  return {
421
610
  content: [
422
- { type: 'text', text: 'Error: REVEALUI_API_URL and REVEALUI_API_KEY must be set' },
611
+ { type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
423
612
  ],
424
613
  isError: true,
425
614
  };
426
615
  }
616
+ // Fail-closed for mutations: the receipt is written BEFORE the tool runs,
617
+ // so a state change can never happen without a durable record of it. If
618
+ // the write fails, refuse the call — nothing executes.
619
+ if (mutating) {
620
+ const recorded = await writeReceipt('invoked');
621
+ if (!recorded) {
622
+ return {
623
+ content: [{ type: 'text', text: 'Error: audit log unavailable; mutating tool refused' }],
624
+ isError: true,
625
+ };
626
+ }
627
+ }
427
628
  try {
428
629
  let data;
429
630
  switch (toolName) {
430
631
  case 'revealui_list_sites': {
431
- const parsed = validateToolArgs(ListSitesArgsSchema, request.params.arguments, toolName);
632
+ const parsed = validateToolArgs(ListSitesArgsSchema, rawArgs, toolName);
432
633
  if (!parsed.ok)
433
- return parsed.error;
634
+ return denied(parsed.error);
434
635
  const { limit = 20, page = 1 } = parsed.value;
435
636
  data = await apiGet(apiUrl, apiKey, '/api/sites', {
436
637
  limit: String(limit),
@@ -439,10 +640,13 @@ export function createRevealuiContentServer(options) {
439
640
  break;
440
641
  }
441
642
  case 'revealui_list_content': {
442
- const parsed = validateToolArgs(ListContentArgsSchema, request.params.arguments, toolName);
643
+ const parsed = validateToolArgs(ListContentArgsSchema, rawArgs, toolName);
443
644
  if (!parsed.ok)
444
- return parsed.error;
645
+ return denied(parsed.error);
445
646
  const { site_id, collection, limit = 20, page = 1, status } = parsed.value;
647
+ const notExposed = await denyIfCollectionNotExposed(collection);
648
+ if (notExposed)
649
+ return notExposed;
446
650
  const params = {
447
651
  limit: String(limit),
448
652
  page: String(page),
@@ -455,17 +659,20 @@ export function createRevealuiContentServer(options) {
455
659
  break;
456
660
  }
457
661
  case 'revealui_get_content': {
458
- const parsed = validateToolArgs(GetContentArgsSchema, request.params.arguments, toolName);
662
+ const parsed = validateToolArgs(GetContentArgsSchema, rawArgs, toolName);
459
663
  if (!parsed.ok)
460
- return parsed.error;
664
+ return denied(parsed.error);
461
665
  const { collection, id } = parsed.value;
666
+ const notExposed = await denyIfCollectionNotExposed(collection);
667
+ if (notExposed)
668
+ return notExposed;
462
669
  data = await apiGet(apiUrl, apiKey, `/api/${collection}/${id}`);
463
670
  break;
464
671
  }
465
672
  case 'revealui_list_users': {
466
- const parsed = validateToolArgs(ListUsersArgsSchema, request.params.arguments, toolName);
673
+ const parsed = validateToolArgs(ListUsersArgsSchema, rawArgs, toolName);
467
674
  if (!parsed.ok)
468
- return parsed.error;
675
+ return denied(parsed.error);
469
676
  const { site_id, limit = 20, page = 1 } = parsed.value;
470
677
  const params = {
471
678
  limit: String(limit),
@@ -477,9 +684,9 @@ export function createRevealuiContentServer(options) {
477
684
  break;
478
685
  }
479
686
  case 'revealui_site_stats': {
480
- const parsed = validateToolArgs(SiteStatsArgsSchema, request.params.arguments, toolName);
687
+ const parsed = validateToolArgs(SiteStatsArgsSchema, rawArgs, toolName);
481
688
  if (!parsed.ok)
482
- return parsed.error;
689
+ return denied(parsed.error);
483
690
  const { site_id } = parsed.value;
484
691
  const params = {};
485
692
  if (site_id)
@@ -488,11 +695,17 @@ export function createRevealuiContentServer(options) {
488
695
  break;
489
696
  }
490
697
  default:
491
- return {
698
+ return denied({
492
699
  content: [{ type: 'text', text: `Error: Unknown tool: ${toolName}` }],
493
700
  isError: true,
494
- };
701
+ });
495
702
  }
703
+ // Read tools record the receipt AFTER a successful call and degrade on a
704
+ // write failure (the data is already fetched; the sink logs + marks the
705
+ // degraded write). Mutations already recorded their receipt above.
706
+ if (!mutating)
707
+ await writeReceipt('invoked');
708
+ await fireMeter(false);
496
709
  return {
497
710
  content: [
498
711
  {
@@ -511,6 +724,9 @@ export function createRevealuiContentServer(options) {
511
724
  };
512
725
  }
513
726
  catch (err) {
727
+ const httpStatus = err instanceof ApiRequestError ? err.status : undefined;
728
+ await writeReceipt('failed', { httpStatus });
729
+ await fireMeter(true);
514
730
  return {
515
731
  content: [
516
732
  { type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },