Skip to content
reaatechREAATECH

@reaatech/multi-tenant-mcp-artifact-store

npm v0.1.0

Provides tenant-isolated file storage with built-in path safety, quota enforcement, and TTL-based lifecycle management. It exposes `FileSystemArtifactStore` and `S3ArtifactStore` classes that implement a common `ArtifactStore` interface, with the S3 implementation requiring the `@aws-sdk/client-s3` peer dependency.

@reaatech/multi-tenant-mcp-artifact-store

npm version License: MIT CI

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

Tenant-isolated artifact and file storage. Supports filesystem and S3 backends with automatic namespace isolation and lifecycle management.

Installation

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

For the S3 backend, install the optional peer:

terminal
pnpm add @aws-sdk/client-s3

Feature Overview

  • Automatic namespace isolation — Every artifact path is prefixed with {tenantId}/, preventing cross-tenant access.
  • Path-safety built-in — Path traversal attacks are blocked; all paths are validated and normalised before storage operations.
  • Pluggable backends — Filesystem for development, S3 for production. Implement ArtifactStore for any other storage system.
  • Quota enforcement — Configurable per-tenant byte count and file count limits.
  • Lifecycle management — TTL-based cleanup of stale artifacts.

Quick Start

typescript
import {
  FileSystemArtifactStore,
  ArtifactLifecycleManager,
} from '@reaatech/multi-tenant-mcp-artifact-store';
 
// Filesystem (development)
const store = new FileSystemArtifactStore({ baseDir: '/data/artifacts' });
 
await store.put('tenant-a', 'report.json', Buffer.from(JSON.stringify({ value: 42 })), 'application/json');
 
const data = await store.get('tenant-a', 'report.json'); // Buffer
const exists = await store.exists('tenant-b', 'report.json'); // false — isolated
const list = await store.list('tenant-a'); // [Artifact, ...]
 
await store.delete('tenant-a', 'report.json');
 
// TTL cleanup — delete artifacts older than 30 days
const lifecycle = new ArtifactLifecycleManager({ maxAgeMs: 30 * 24 * 60 * 60 * 1000 });
await lifecycle.cleanup(store);

S3 (production)

typescript
import { S3Client } from '@aws-sdk/client-s3';
import { S3ArtifactStore } from '@reaatech/multi-tenant-mcp-artifact-store';
 
const s3 = new S3Client({ region: 'us-east-1' });
const store = new S3ArtifactStore(s3, 'my-bucket', 'artifacts');

Exports

ExportKindDescription
ArtifactInterfaceStored artifact: id, tenantId, name, contentType, size, createdAt, updatedAt, metadata
ArtifactStoreInterfaceContract: put, get, list, delete, exists
StorageQuotaInterfacemaxBytes, maxCount per tenant
FileSystemArtifactStoreClassFilesystem-backed storage with path safety
S3ArtifactStoreClassS3-backed storage (requires @aws-sdk/client-s3)
ArtifactLifecycleManagerClassTTL-based cleanup of artifacts older than maxAgeMs

License

MIT