class ToolSchemaCache:
def __init__(self, cache_path="~/.harness/tool_cache.db"):
self.db = sqlite3.connect(cache_path)
self.db.execute("""
CREATE TABLE IF NOT EXISTS tool_schemas (
server_name TEXT,
tool_name TEXT,
schema TEXT,
schema_version TEXT,
cached_at INTEGER,
PRIMARY KEY (server_name, tool_name)
)
""")
def get_or_fetch(self, server: MCPServer, tool_name: str) -> dict:
# 1. 先查缓存
cached = self.db.execute(
"SELECT schema, schema_version FROM tool_schemas WHERE server_name = ? AND tool_name = ?",
(server.name, tool_name)
).fetchone()
if cached:
schema_json, cached_version = cached
# 2. 检查版本是否过期
current_version = server.get_schema_version(tool_name)
if current_version == cached_version:
return json.loads(schema_json) # 命中缓存
# 3. 缓存未命中,重新获取
schema = server.fetch_tool_schema(tool_name)
self.db.execute(
"INSERT OR REPLACE INTO tool_schemas VALUES (?, ?, ?, ?, ?)",
(server.name, tool_name, json.dumps(schema),
server.get_schema_version(tool_name), int(time.time()))
)
self.db.commit()
return schema