diff --git a/src/basic_memory/api/app.py b/src/basic_memory/api/app.py index 597f646bc..626a91a18 100644 --- a/src/basic_memory/api/app.py +++ b/src/basic_memory/api/app.py @@ -22,18 +22,19 @@ webdav, ) from basic_memory.config import ConfigManager -from basic_memory.services.initialization import initialize_file_sync +from basic_memory.services.initialization import initialize_file_sync, initialize_app @asynccontextmanager async def lifespan(app: FastAPI): # pragma: no cover - """Lifecycle manager for the FastAPI app.""" + """Lifecycle manager for the FastAPI app. Not called in stdio mcp mode""" app_config = ConfigManager().config logger.info("Starting Basic Memory API") - print(f"fastapi {app_config.projects}") - # Cache database connections in app state for performance (no project reconciliation) + await initialize_app(app_config) + + # Cache database connections in app state for performance logger.info("Initializing database and caching connections...") engine, session_maker = await db.get_or_create_db(app_config.database_path) app.state.engine = engine diff --git a/src/basic_memory/cli/commands/mcp.py b/src/basic_memory/cli/commands/mcp.py index 44561a331..3b3ea32c0 100644 --- a/src/basic_memory/cli/commands/mcp.py +++ b/src/basic_memory/cli/commands/mcp.py @@ -17,6 +17,8 @@ # Import prompts to register them import basic_memory.mcp.prompts # noqa: F401 # pragma: no cover from loguru import logger +import threading +from basic_memory.services.initialization import initialize_file_sync @app.command() @@ -50,10 +52,6 @@ def mcp( os.environ["BASIC_MEMORY_MCP_PROJECT"] = project_name logger.info(f"MCP server constrained to project: {project_name}") - # Use unified thread-based sync approach for both transports - import threading - from basic_memory.services.initialization import initialize_file_sync - app_config = ConfigManager().config def run_file_sync(): diff --git a/src/basic_memory/mcp/server.py b/src/basic_memory/mcp/server.py index 1125ab0ec..e1dfaebb9 100644 --- a/src/basic_memory/mcp/server.py +++ b/src/basic_memory/mcp/server.py @@ -2,39 +2,8 @@ Basic Memory FastMCP server. """ -import asyncio -from contextlib import asynccontextmanager -from dataclasses import dataclass -from typing import AsyncIterator, Optional, Any - from fastmcp import FastMCP -from basic_memory.config import ConfigManager -from basic_memory.services.initialization import initialize_app - - -@dataclass -class AppContext: - watch_task: Optional[asyncio.Task] - migration_manager: Optional[Any] = None - - -@asynccontextmanager -async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]: # pragma: no cover - """ """ - app_config = ConfigManager().config - # Initialize on startup (now returns migration_manager) - migration_manager = await initialize_app(app_config) - - try: - yield AppContext(watch_task=None, migration_manager=migration_manager) - finally: - # Cleanup on shutdown - migration tasks will be cancelled automatically - pass - - -# Create the shared server instance with custom Stytch auth mcp = FastMCP( name="Basic Memory", - lifespan=app_lifespan, )