Skip to content
reaatechREAATECH

@reaatech/multi-tenant-mcp-observability

npm v0.1.0

Provides a structured JSON logger and an LRU-bounded metrics collector for MCP servers that automatically injects tenant IDs from a `TenantContextStore`. It exports a `ConsoleTenantLogger` class for logging and a `MetricsCollector` class for tracking per-tenant usage without memory exhaustion.

@reaatech/multi-tenant-mcp-observability

npm version License: MIT CI

Status: Pre-1.0 — APIs may change in minor versions. Pin to a specific version in production.

Structured logging and per-tenant metrics for multi-tenant MCP servers. Logs and counters automatically carry the current tenant ID from TenantContextStore.

Installation

terminal
npm install @reaatech/multi-tenant-mcp-observability
# or
pnpm add @reaatech/multi-tenant-mcp-observability

Feature Overview

  • Structured console loggerConsoleTenantLogger writes JSON-serialisable objects to stdout/ stderr; debug/info to stdout, warn/error to stderr.
  • Tenant context auto-attached — When a TenantContextStore is active, every log entry includes tenantId automatically.
  • LRU-bounded metricsMetricsCollector uses BoundedMap internally; high-cardinality tenant IDs won’t exhaust memory.

Quick Start

typescript
import {
  ConsoleTenantLogger,
  MetricsCollector,
} from '@reaatech/multi-tenant-mcp-observability';
 
const logger = new ConsoleTenantLogger({ level: 'info' });
const metrics = new MetricsCollector();
 
logger.info('Server started', { port: 3000 });
// stdout: info Server started {"port":3000}
 
logger.error('Connection failed', { error: 'timeout', stack: '...' });
// stderr: error Connection failed {"error":"timeout","stack":"..."}
 
metrics.increment('tools/call', 'tenant-a');
metrics.increment('tools/call', 'tenant-b');

With Tenant Context

When a TenantContextStore is running, the logger automatically reads the current tenant:

typescript
import { TenantContextStore } from '@reaatech/multi-tenant-mcp-tenant-resolver';
import { ConsoleTenantLogger } from '@reaatech/multi-tenant-mcp-observability';
 
const store = new TenantContextStore();
const logger = new ConsoleTenantLogger({ level: 'debug', contextStore: store });
 
store.run({ tenantId: 'acme-corp', metadata: {}, resolvedAt: new Date() }, () => {
  logger.info('Request received');
  // stdout: info Request received {"tenantId":"acme-corp"}
});

Exports

ExportKindDescription
TenantLoggerInterfacedebug, info, warn, error methods
LogEntryInterfacelevel, message, timestamp, tenantId?, metadata?
ConsoleTenantLoggerClassStructured logger writing to stdout/stderr; optionally reads tenant from TenantContextStore
ConsoleTenantLoggerOptionsInterfacelevel (‘trace’..‘error’), contextStore?, includeStackTraces?
MetricsCollectorClassIn-memory counter metrics with LRU-bounded tenant labels
MetricsCollectorOptionsInterfacemaxTenants cap for the internal LRU map
CounterInterfaceincrement(n?), value, reset

License

MIT