diff --git a/mempalace/mcp_server.py b/mempalace/mcp_server.py index 066f93f..520394d 100644 --- a/mempalace/mcp_server.py +++ b/mempalace/mcp_server.py @@ -23,7 +23,6 @@ import sys import json import logging import hashlib -import time from datetime import datetime from pathlib import Path @@ -95,7 +94,6 @@ def _wal_log(operation: str, params: dict, result: dict = None): _client_cache = None _collection_cache = None -_meta_cache = {"data": None, "timestamp": 0, "ttl": 30} # 30 second TTL def _get_client(): @@ -106,20 +104,6 @@ def _get_client(): return _client_cache -def _get_cached_metadata(): - """Return all record metadatas with a time-based cache to avoid repeated full scans.""" - now = time.time() - if _meta_cache["data"] is not None and (now - _meta_cache["timestamp"]) < _meta_cache["ttl"]: - return _meta_cache["data"] - col = _get_collection() - if not col: - return None - all_meta = col.get(include=["metadatas"])["metadatas"] - _meta_cache["data"] = all_meta - _meta_cache["timestamp"] = now - return all_meta - - def _get_collection(create=False): """Return the ChromaDB collection, caching the client between calls.""" global _collection_cache @@ -152,13 +136,12 @@ def tool_status(): wings = {} rooms = {} try: - all_meta = _get_cached_metadata() - if all_meta: - for m in all_meta: - w = m.get("wing", "unknown") - r = m.get("room", "unknown") - wings[w] = wings.get(w, 0) + 1 - rooms[r] = rooms.get(r, 0) + 1 + all_meta = col.get(include=["metadatas"])["metadatas"] + for m in all_meta: + w = m.get("wing", "unknown") + r = m.get("room", "unknown") + wings[w] = wings.get(w, 0) + 1 + rooms[r] = rooms.get(r, 0) + 1 except Exception: pass return { @@ -210,11 +193,10 @@ def tool_list_wings(): return _no_palace() wings = {} try: - all_meta = _get_cached_metadata() - if all_meta: - for m in all_meta: - w = m.get("wing", "unknown") - wings[w] = wings.get(w, 0) + 1 + all_meta = col.get(include=["metadatas"])["metadatas"] + for m in all_meta: + w = m.get("wing", "unknown") + wings[w] = wings.get(w, 0) + 1 except Exception: pass return {"wings": wings} @@ -226,12 +208,10 @@ def tool_list_rooms(wing: str = None): return _no_palace() rooms = {} try: + kwargs = {"include": ["metadatas"]} if wing: - # Filtered query — cannot use the full metadata cache - all_meta = col.get(include=["metadatas"], where={"wing": wing})["metadatas"] - else: - # No filter — use the cached metadata - all_meta = _get_cached_metadata() or [] + kwargs["where"] = {"wing": wing} + all_meta = col.get(**kwargs)["metadatas"] for m in all_meta: r = m.get("room", "unknown") rooms[r] = rooms.get(r, 0) + 1 @@ -246,14 +226,13 @@ def tool_get_taxonomy(): return _no_palace() taxonomy = {} try: - all_meta = _get_cached_metadata() - if all_meta: - for m in all_meta: - w = m.get("wing", "unknown") - r = m.get("room", "unknown") - if w not in taxonomy: - taxonomy[w] = {} - taxonomy[w][r] = taxonomy[w].get(r, 0) + 1 + all_meta = col.get(include=["metadatas"])["metadatas"] + for m in all_meta: + w = m.get("wing", "unknown") + r = m.get("room", "unknown") + if w not in taxonomy: + taxonomy[w] = {} + taxonomy[w][r] = taxonomy[w].get(r, 0) + 1 except Exception: pass return {"taxonomy": taxonomy} @@ -388,7 +367,6 @@ def tool_add_drawer( } ], ) - _meta_cache["data"] = None # Invalidate metadata cache logger.info(f"Filed drawer: {drawer_id} → {wing}/{room}") return {"success": True, "drawer_id": drawer_id, "wing": wing, "room": room} except Exception as e: @@ -418,7 +396,6 @@ def tool_delete_drawer(drawer_id: str): try: col.delete(ids=[drawer_id]) - _meta_cache["data"] = None # Invalidate metadata cache logger.info(f"Deleted drawer: {drawer_id}") return {"success": True, "drawer_id": drawer_id} except Exception as e: @@ -544,7 +521,6 @@ def tool_diary_write(agent_name: str, entry: str, topic: str = "general"): } ], ) - _meta_cache["data"] = None # Invalidate metadata cache logger.info(f"Diary entry: {entry_id} → {wing}/diary/{topic}") return { "success": True,