From 053fca2775ea01f06b544887379d91d4f4b03ea7 Mon Sep 17 00:00:00 2001 From: adv3nt3 Date: Thu, 9 Apr 2026 19:52:59 +0200 Subject: [PATCH] fix: defer KnowledgeGraph init to first use in MCP server Replace module-level _kg = KnowledgeGraph() with lazy _get_kg() that creates the instance on first call. Respects --palace flag for custom db_path when provided. Importing mcp_server no longer creates ~/.mempalace/knowledge_graph.sqlite3 as a side effect, fixing test isolation and spurious database creation. --- mempalace/mcp_server.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/mempalace/mcp_server.py b/mempalace/mcp_server.py index bffd3b2f2d..22e6f24232 100644 --- a/mempalace/mcp_server.py +++ b/mempalace/mcp_server.py @@ -57,10 +57,19 @@ def _parse_args(): os.environ["MEMPALACE_PALACE_PATH"] = os.path.abspath(_args.palace) _config = MempalaceConfig() -if _args.palace: - _kg = KnowledgeGraph(db_path=os.path.join(_config.palace_path, "knowledge_graph.sqlite3")) -else: - _kg = KnowledgeGraph() +_kg = None + + +def _get_kg(): + global _kg + if _kg is None: + if _args.palace: + _kg = KnowledgeGraph( + db_path=os.path.join(_config.palace_path, "knowledge_graph.sqlite3") + ) + else: + _kg = KnowledgeGraph() + return _kg _client_cache = None @@ -415,7 +424,7 @@ def tool_delete_drawer(drawer_id: str): def tool_kg_query(entity: str, as_of: str = None, direction: str = "both"): """Query the knowledge graph for an entity's relationships.""" - results = _kg.query_entity(entity, as_of=as_of, direction=direction) + results = _get_kg().query_entity(entity, as_of=as_of, direction=direction) return {"entity": entity, "as_of": as_of, "facts": results, "count": len(results)} @@ -440,7 +449,7 @@ def tool_kg_add( "source_closet": source_closet, }, ) - triple_id = _kg.add_triple( + triple_id = _get_kg().add_triple( subject, predicate, object, valid_from=valid_from, source_closet=source_closet ) return {"success": True, "triple_id": triple_id, "fact": f"{subject} → {predicate} → {object}"} @@ -452,7 +461,7 @@ def tool_kg_invalidate(subject: str, predicate: str, object: str, ended: str = N "kg_invalidate", {"subject": subject, "predicate": predicate, "object": object, "ended": ended}, ) - _kg.invalidate(subject, predicate, object, ended=ended) + _get_kg().invalidate(subject, predicate, object, ended=ended) return { "success": True, "fact": f"{subject} → {predicate} → {object}", @@ -462,13 +471,13 @@ def tool_kg_invalidate(subject: str, predicate: str, object: str, ended: str = N def tool_kg_timeline(entity: str = None): """Get chronological timeline of facts, optionally for one entity.""" - results = _kg.timeline(entity) + results = _get_kg().timeline(entity) return {"entity": entity or "all", "timeline": results, "count": len(results)} def tool_kg_stats(): """Knowledge graph overview: entities, triples, relationship types.""" - return _kg.stats() + return _get_kg().stats() # ==================== AGENT DIARY ====================