Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/basic_memory/api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 2 additions & 4 deletions src/basic_memory/cli/commands/mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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():
Expand Down
31 changes: 0 additions & 31 deletions src/basic_memory/mcp/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Loading