Skip to content

Conversation

@wagnert
Copy link
Member

@wagnert wagnert commented Nov 24, 2025

Release v2.1.0: Per-Request User Context Support

This PR merges the completed v2.1.0 release from develop to staging for pre-production testing.

Summary

Added per-request user context support for multi-tenant MCP servers, enabling each request to execute with a specific user's permissions and context.

Features

  • Per-Request User Context (#3)

    • Added optional runAsUserEmail parameter to ConnectionManager.get()
    • Added optional runAsUserEmail parameter to SchemaManager.table()
    • User-specific clients created on-the-fly (no caching)
    • Overrides global runAsUserEmail from schema
    • 100% backward compatible
  • Enhanced Schema Configuration

    • Added optional runAsUserEmail field to ConnectionDefinition
    • Allows global default user at connection level
  • Architecture Improvements

    • Removed table client caching in SchemaManager
    • On-the-fly DynamicTable creation for better per-request handling
    • Simplified initialize() method

Testing

  • ✅ 31 new tests added (13 ConnectionManager + 18 SchemaManager)
  • ✅ Total test suite: 157 tests, all passing
  • ✅ Build successful
  • ✅ SemVer validated: MINOR (backward compatible)

Fixes

  • Fixed package.json version from 0.2.0 to 2.1.0 (#4)

Documentation

  • Updated CLAUDE.md with new features and usage patterns
  • Added CHANGELOG.md with complete release notes
  • Added comprehensive examples for multi-tenant MCP servers

Breaking Changes

None - this is a fully backward compatible MINOR release.

Migration Required

No migration required. Existing code continues to work without changes.

Closes


🤖 Generated with Claude Code

wagnert and others added 7 commits November 14, 2025 17:18
chore: promote staging to production
This release introduces comprehensive AppSheet field type support with
validation - a major breaking change requiring migration.

## Breaking Changes ⚠️

- Generic types (string, number, boolean, etc.) replaced with 27
  AppSheet-specific field types
- Shorthand field format removed - only full object format supported
- Property 'enum' renamed to 'allowedValues'

## Features

- 27 AppSheet field types across 7 categories
- Modular validation architecture (BaseTypeValidator, FormatValidator,
  AppSheetTypeValidator)
- Enhanced SchemaInspector with smart enum detection and allowedValues
  extraction
- Comprehensive validation for Email, URL, Phone, Enum, EnumList,
  Percent, Date, DateTime, and all other types

## Documentation

- Added MIGRATION.md with complete migration guide
- Updated CLAUDE.md with new type system
- Added INTEGRATION_CONCEPT.md for SOSO-247

## Tests

- 126 tests (all passing)
- 81.88% coverage
- 100% coverage for DynamicTable.ts

## Migration

See MIGRATION.md for detailed migration instructions from v1.x to v2.0.0.
Estimated migration time: 15-30 minutes per schema file.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Complete v2.0.0 release with SOSO-246 documentation updates.

This final merge includes:
- SOSO-247: AppSheet Field Type Support (27 types)
- SOSO-246: Updated DI integration documentation for v2.0.0
- Complete migration guide (MIGRATION.md)
- 126 tests, 81.88% coverage

Breaking Changes:
- Generic types replaced with AppSheet-specific types
- Shorthand field format removed
- Property 'enum' renamed to 'allowedValues'

Documentation:
- All SOSO-246 examples updated to v2.0.0 format
- Validators documented as stateless (no DI)
- Migration guide completed

See MIGRATION.md for upgrade instructions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
…support

Add INTEGRATION_CONCEPT.md documenting the solution for per-request user
context in DynamicTable API:

- Extend ConnectionManager.get() with optional runAsUserEmail parameter
- Extend SchemaManager.table() with optional runAsUserEmail parameter
- No caching needed - on-the-fly client/table creation (lightweight)
- Simplified initialize() - only registers connections, no table caching
- 100% backward compatible - optional parameters
- Clean layered architecture: ConnectionManager → SchemaManager → DynamicTable

Related: #3

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
… MCP servers

Add optional runAsUserEmail parameter to ConnectionManager.get() and SchemaManager.table()
to enable per-request user context in multi-tenant environments.

Changes:
- ConnectionManager.get(name, runAsUserEmail?): Creates user-specific clients on-the-fly
- SchemaManager.table(conn, table, runAsUserEmail?): Creates user-specific table clients
- SchemaManager: Removed table caching, creates DynamicTable instances on-the-fly
- ConnectionDefinition: Added optional runAsUserEmail field
- Tests: Added 31 comprehensive tests (ConnectionManager + SchemaManager)
- Documentation: Updated CLAUDE.md with usage patterns and examples

Breaking Changes: None (100% backward compatible)

Closes #3
Closes #4

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
- Updated version to 2.1.0 in package.json
- Added comprehensive CHANGELOG.md with v2.1.0 release notes
- Documents fixes for #3 and #4

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@wagnert wagnert merged commit 9b5fc1c into staging Nov 24, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants