Athena — roomy-mobile/archive/changes/2026-01-05-add-roomy-firestore-mcp/design.md

Context

Roomy is a Firebase monorepo with YAML-based datamodels defining Firestore collections. AI assistants need direct Firestore access for development workflows (seeding data, debugging, querying).

Goals / Non-Goals

Goals:

  • MCP server that exposes Firestore CRUD operations
  • Schema discovery from existing YAML datamodels
  • Support emulator, staging, and production environments
  • JSON-safe timestamp serialization for MCP protocol

Non-Goals:

  • Scraping or data migration tools
  • UI integration beyond MCP configuration
  • Modifying the datamodel YAML format

Decisions

Package Location

  • Decision: roomy-firestore-mcp/ in repo root
  • Rationale: Keeps MCP tooling at repo level, not inside roomy-firebase/ (which is Firebase backend only)

Datamodels Path

  • Decision: Read from roomy-firebase/data_models/ (underscore, not hyphen)
  • Rationale: Match existing directory structure in the monorepo

Timestamp Format

  • Decision: { "__time__": "<ISO8601>" } wrapper for all timestamps
  • Rationale: JSON-safe serialization that round-trips through MCP protocol

Environment Variables

  • ROOMY_MCP_REPO_ROOT: Path to roomy-firebase/ directory
  • ROOMY_MCP_DEFAULT_ENV: emulator|staging|prod (default: emulator)
  • ROOMY_MCP_SERVICE_ACCOUNT_PATH_STAGING: Required for staging
  • ROOMY_MCP_SERVICE_ACCOUNT_PATH_PROD: Required for production

Entity Key Derivation

  • Decision: Join static collection segments with underscore
  • Example: scrapingSessions/{$sessionId}/logs/{$id}scrapingSessions_logs

Risks / Trade-offs

Risk: Service Account Exposure

  • Mitigation: SA paths stored in env vars, not committed to repo
  • Mitigation: Claude/Cursor MCP config uses absolute paths outside repo

Risk: Accidental Production Writes

  • Mitigation: Default environment is emulator
  • Mitigation: Explicit set_env call required to switch environments

Migration Plan

N/A - New capability, no existing implementation to migrate.

Open Questions

None.

Reacties

Nog geen reacties