From 6b716d57d2f5c46a64773e1ad9cce536d2cae54c Mon Sep 17 00:00:00 2001 From: Daniel Chalef <131175+danielchalef@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:28:34 -0700 Subject: [PATCH] feat: Add helpful error message for database connection failures - Catch Redis/database connection errors during initialization - Provide clear, formatted error messages with startup instructions - Include provider-specific guidance (FalkorDB vs Neo4j) - Improves developer experience when database is not running --- mcp_server/src/graphiti_mcp_server.py | 78 ++++++++++++++++++--------- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/mcp_server/src/graphiti_mcp_server.py b/mcp_server/src/graphiti_mcp_server.py index c062a0da..f0b379d9 100644 --- a/mcp_server/src/graphiti_mcp_server.py +++ b/mcp_server/src/graphiti_mcp_server.py @@ -209,33 +209,61 @@ class GraphitiService: self.entity_types = custom_types # Initialize Graphiti client with appropriate driver - if self.config.database.provider.lower() == 'falkordb': - # For FalkorDB, create a FalkorDriver instance directly - from graphiti_core.driver.falkordb_driver import FalkorDriver + try: + if self.config.database.provider.lower() == 'falkordb': + # For FalkorDB, create a FalkorDriver instance directly + from graphiti_core.driver.falkordb_driver import FalkorDriver - falkor_driver = FalkorDriver( - host=db_config['host'], - port=db_config['port'], - password=db_config['password'], - database=db_config['database'], - ) + falkor_driver = FalkorDriver( + host=db_config['host'], + port=db_config['port'], + password=db_config['password'], + database=db_config['database'], + ) - self.client = Graphiti( - graph_driver=falkor_driver, - llm_client=llm_client, - embedder=embedder_client, - max_coroutines=self.semaphore_limit, - ) - else: - # For Neo4j (default), use the original approach - self.client = Graphiti( - uri=db_config['uri'], - user=db_config['user'], - password=db_config['password'], - llm_client=llm_client, - embedder=embedder_client, - max_coroutines=self.semaphore_limit, - ) + self.client = Graphiti( + graph_driver=falkor_driver, + llm_client=llm_client, + embedder=embedder_client, + max_coroutines=self.semaphore_limit, + ) + else: + # For Neo4j (default), use the original approach + self.client = Graphiti( + uri=db_config['uri'], + user=db_config['user'], + password=db_config['password'], + llm_client=llm_client, + embedder=embedder_client, + max_coroutines=self.semaphore_limit, + ) + except Exception as db_error: + # Check for connection errors + error_msg = str(db_error).lower() + if 'connection refused' in error_msg or 'could not connect' in error_msg: + db_provider = self.config.database.provider + if db_provider.lower() == 'falkordb': + raise RuntimeError( + f"\n{'='*70}\n" + f"Database Connection Error: FalkorDB is not running\n" + f"{'='*70}\n\n" + f"FalkorDB at {db_config['host']}:{db_config['port']} is not accessible.\n\n" + f"To start FalkorDB:\n" + f" - Using Docker Compose: cd mcp_server && docker compose up\n" + f" - Or run FalkorDB manually: docker run -p 6379:6379 falkordb/falkordb\n\n" + f"{'='*70}\n" + ) from db_error + else: + raise RuntimeError( + f"\n{'='*70}\n" + f"Database Connection Error: {db_provider} is not running\n" + f"{'='*70}\n\n" + f"{db_provider} at {db_config.get('uri', 'unknown')} is not accessible.\n\n" + f"Please ensure {db_provider} is running and accessible.\n\n" + f"{'='*70}\n" + ) from db_error + # Re-raise other errors + raise # Build indices await self.client.build_indices_and_constraints()