diff --git a/mcp_server/docker/docker-compose-falkordb.yml b/mcp_server/docker/docker-compose-falkordb.yml index c6687509..eec85c2c 100644 --- a/mcp_server/docker/docker-compose-falkordb.yml +++ b/mcp_server/docker/docker-compose-falkordb.yml @@ -51,7 +51,7 @@ services: - ../config/config-docker-falkordb.yaml:/app/config/config.yaml:ro ports: - "8000:8000" # Expose the MCP server via HTTP for SSE transport - command: ["uv", "run", "graphiti_mcp_server.py", "--transport", "sse", "--config", "/app/config/config.yaml"] + command: ["uv", "run", "src/graphiti_mcp_server.py", "--transport", "sse", "--config", "/app/config/config.yaml"] volumes: falkordb_data: diff --git a/mcp_server/docker/docker-compose-neo4j.yml b/mcp_server/docker/docker-compose-neo4j.yml index 0b3eda0c..fe96401a 100644 --- a/mcp_server/docker/docker-compose-neo4j.yml +++ b/mcp_server/docker/docker-compose-neo4j.yml @@ -57,7 +57,7 @@ services: - ../config/config-docker-neo4j.yaml:/app/config/config.yaml:ro ports: - "8000:8000" # Expose the MCP server via HTTP for SSE transport - command: ["uv", "run", "graphiti_mcp_server.py", "--transport", "sse", "--config", "/app/config/config.yaml"] + command: ["uv", "run", "src/graphiti_mcp_server.py", "--transport", "sse", "--config", "/app/config/config.yaml"] volumes: neo4j_data: diff --git a/mcp_server/docker/docker-compose.yml b/mcp_server/docker/docker-compose.yml index 84ad72a7..e1b488d8 100644 --- a/mcp_server/docker/docker-compose.yml +++ b/mcp_server/docker/docker-compose.yml @@ -34,7 +34,7 @@ services: - kuzu_data:/data ports: - "8000:8000" # Expose the MCP server via HTTP for SSE transport - command: ["uv", "run", "graphiti_mcp_server.py", "--transport", "sse", "--config", "/app/config/config.yaml"] + command: ["uv", "run", "src/graphiti_mcp_server.py", "--transport", "sse", "--config", "/app/config/config.yaml"] # Volume for persistent KuzuDB storage volumes: diff --git a/mcp_server/src/config/schema.py b/mcp_server/src/config/schema.py index ef7e75c6..0c979f83 100644 --- a/mcp_server/src/config/schema.py +++ b/mcp_server/src/config/schema.py @@ -29,10 +29,31 @@ class YamlSettingsSource(PydanticBaseSettingsSource): def replacer(match): var_name = match.group(1) default_value = match.group(3) if match.group(3) is not None else '' - return os.environ.get(var_name, default_value) + result = os.environ.get(var_name, default_value) + + # Convert string booleans to actual booleans + if result.lower() == 'true': + return 'true' # Keep as string, let Pydantic handle conversion + elif result.lower() == 'false': + return 'false' # Keep as string, let Pydantic handle conversion + return result pattern = r'\$\{([^:}]+)(:([^}]*))?\}' - return re.sub(pattern, replacer, value) + + # Check if the entire value is a single env var expression with boolean default + full_match = re.fullmatch(pattern, value) + if full_match: + result = replacer(full_match) + # If the result is a boolean string and the whole value was the env var, + # return the actual boolean + if result == 'true': + return True + elif result == 'false': + return False + return result + else: + # Otherwise, do string substitution + return re.sub(pattern, replacer, value) elif isinstance(value, dict): return {k: self._expand_env_vars(v) for k, v in value.items()} elif isinstance(value, list): diff --git a/mcp_server/src/graphiti_mcp_server.py b/mcp_server/src/graphiti_mcp_server.py index c7c19a2c..2f634621 100644 --- a/mcp_server/src/graphiti_mcp_server.py +++ b/mcp_server/src/graphiti_mcp_server.py @@ -641,8 +641,12 @@ async def get_status() -> StatusResponse: try: client = await graphiti_service.get_client() - # Test database connection - await client.driver.client.verify_connectivity() # type: ignore + # Test database connection with a simple query + # This works for all supported databases (Neo4j, FalkorDB, KuzuDB) + async with client.driver.session() as session: + result = await session.run('MATCH (n) RETURN count(n) as count') + # Consume the result to verify query execution + _ = [record async for record in result] provider_info = f'{config.database.provider} database' return StatusResponse(