#!/usr/bin/env python3
"""
Ember V3 — Local-first persistent temporal memory for Claude.
MCP Server entry point.
Architecture:
- Single SQLite database (~/.ember-v3/ember.db)
- 4-tier memory (working → session → relational → glacier)
- CORAL checkpointing for context management
- Semantic search with FTS5 fallback
- 19 MCP tools for memory management
Usage:
python ember_server.py # stdio mode (for MCP clients)
"""
import sys
import signal
import logging
# Configure logging before any imports
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(name)s] %(levelname)s: %(message)s",
stream=sys.stderr,
)
logger = logging.getLogger("ember")
def main():
from mcp.server.fastmcp import FastMCP
from ember.memory.db import initialize_db
from ember.memory.embeddings import EmbeddingEngine
from ember.memory.operations import start_session
from ember.tools.mcp_tools import register_all_tools
# Initialize database
initialize_db()
logger.info("Database initialized")
# Initialize embedding engine (lazy model load)
engine = EmbeddingEngine()
logger.info(f"Embedding engine: {engine.mode}")
# Start session
session_id = start_session()
logger.info(f"Session started: {session_id[:8]}")
# Create MCP server
server = FastMCP("ember-memory")
# Register all tools
register_all_tools(server, engine, session_id)
logger.info("Tools registered")
# Graceful shutdown
def handle_shutdown(signum, frame):
logger.info("Shutdown signal received")
sys.exit(0)
signal.signal(signal.SIGTERM, handle_shutdown)
signal.signal(signal.SIGINT, handle_shutdown)
# Run server (FastMCP handles stdio transport)
logger.info("Ember V3 server running")
server.run()
if __name__ == "__main__":
main()