mcp-sqlite-memory-bank 1.6.0__py3-none-any.whl → 1.6.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,8 +9,7 @@ discovery processes.
9
9
  Author: Robert Meisner
10
10
  """
11
11
 
12
- import logging
13
- from typing import Any, Dict, List, Optional, cast, Union
12
+ from typing import Any, Dict, List, Optional, cast
14
13
  from datetime import datetime
15
14
 
16
15
  from ..database import get_database
@@ -112,17 +111,13 @@ def intelligent_discovery(
112
111
  # Step 2: Content analysis based on goal
113
112
  if discovery_goal in ["understand_content", "find_patterns", "assess_quality"]:
114
113
  discovery_session["steps_completed"].append("content_analysis")
115
- content_analysis = _analyze_content_for_discovery(
116
- db, tables, focus_area, depth
117
- )
114
+ content_analysis = _analyze_content_for_discovery(db, tables, focus_area, depth)
118
115
  overview.update(content_analysis)
119
116
 
120
117
  # Step 3: Schema analysis for structure exploration
121
118
  if discovery_goal in ["explore_structure", "understand_content"]:
122
119
  discovery_session["steps_completed"].append("schema_analysis")
123
- schema_analysis = _analyze_schema_for_discovery(
124
- db, tables, focus_area, depth
125
- )
120
+ schema_analysis = _analyze_schema_for_discovery(db, tables, focus_area, depth)
126
121
  overview.update(schema_analysis)
127
122
 
128
123
  # Step 4: Quality assessment
@@ -164,9 +159,7 @@ def intelligent_discovery(
164
159
  },
165
160
  "next_steps": next_steps,
166
161
  "discovery_session": discovery_session,
167
- "quick_actions": _generate_quick_actions(
168
- discovery_goal, overview, focus_area
169
- ),
162
+ "quick_actions": _generate_quick_actions(discovery_goal, overview, focus_area),
170
163
  },
171
164
  )
172
165
 
@@ -612,10 +605,7 @@ def discover_relationships(
612
605
  )
613
606
 
614
607
  # Discover semantic similarity relationships
615
- if (
616
- "semantic_similarity" in relationship_types
617
- and is_semantic_search_available()
618
- ):
608
+ if "semantic_similarity" in relationship_types and is_semantic_search_available():
619
609
  semantic_relationships = _discover_semantic_relationships(
620
610
  db, target_table, all_tables, similarity_threshold
621
611
  )
@@ -638,9 +628,7 @@ def discover_relationships(
638
628
 
639
629
  # Discover naming pattern relationships
640
630
  if "naming_patterns" in relationship_types:
641
- naming_relationships = _discover_naming_relationships(
642
- target_table, all_tables
643
- )
631
+ naming_relationships = _discover_naming_relationships(target_table, all_tables)
644
632
  table_relationships["naming_related"] = naming_relationships
645
633
  if naming_relationships:
646
634
  insights.append(
@@ -676,13 +664,9 @@ def discover_relationships(
676
664
  "relationship_summary": {
677
665
  "total_relationships": total_relationships,
678
666
  "tables_analyzed": len(relationships),
679
- "strongest_connections": _identify_strongest_connections(
680
- relationships
681
- ),
667
+ "strongest_connections": _identify_strongest_connections(relationships),
682
668
  },
683
- "recommendations": _generate_relationship_recommendations(
684
- relationships, insights
685
- ),
669
+ "recommendations": _generate_relationship_recommendations(relationships, insights),
686
670
  },
687
671
  )
688
672
 
@@ -777,16 +761,12 @@ def _analyze_schema_for_discovery(
777
761
  schema_analysis["total_columns"] += len(columns)
778
762
 
779
763
  # Find text columns
780
- text_columns = [
781
- col for col in columns if "TEXT" in col.get("type", "").upper()
782
- ]
764
+ text_columns = [col for col in columns if "TEXT" in col.get("type", "").upper()]
783
765
  schema_analysis["text_columns_by_table"][table_name] = len(text_columns)
784
766
 
785
767
  # Check for well-structured tables
786
768
  has_id = any(col.get("name") == "id" for col in columns)
787
- has_timestamp = any(
788
- "timestamp" in col.get("name", "").lower() for col in columns
789
- )
769
+ has_timestamp = any("timestamp" in col.get("name", "").lower() for col in columns)
790
770
  has_text_content = len(text_columns) > 0
791
771
 
792
772
  if has_id and has_timestamp and has_text_content:
@@ -798,9 +778,7 @@ def _analyze_schema_for_discovery(
798
778
  f"Table '{table_name}' has very few columns"
799
779
  )
800
780
  if not has_id:
801
- schema_analysis["schema_issues"].append(
802
- f"Table '{table_name}' lacks ID column"
803
- )
781
+ schema_analysis["schema_issues"].append(f"Table '{table_name}' lacks ID column")
804
782
 
805
783
  except Exception:
806
784
  continue
@@ -846,9 +824,7 @@ def _assess_content_quality(
846
824
  non_null_fields = sum(
847
825
  1 for v in row.values() if v is not None and str(v).strip()
848
826
  )
849
- total_content_length = sum(
850
- len(str(v)) for v in row.values() if v is not None
851
- )
827
+ total_content_length = sum(len(str(v)) for v in row.values() if v is not None)
852
828
 
853
829
  # Score based on completeness and content richness
854
830
  if non_null_fields > 2:
@@ -860,9 +836,7 @@ def _assess_content_quality(
860
836
 
861
837
  content_scores.append(min(10, row_score))
862
838
 
863
- table_quality = (
864
- sum(content_scores) / len(content_scores) if content_scores else 0
865
- )
839
+ table_quality = sum(content_scores) / len(content_scores) if content_scores else 0
866
840
  quality_analysis["quality_scores"][table_name] = round(table_quality, 1)
867
841
 
868
842
  # Categorize quality
@@ -889,9 +863,7 @@ def _assess_content_quality(
889
863
  return quality_analysis
890
864
 
891
865
 
892
- def _analyze_search_readiness(
893
- db, tables: List[str], focus_area: Optional[str]
894
- ) -> Dict[str, Any]:
866
+ def _analyze_search_readiness(db, tables: List[str], focus_area: Optional[str]) -> Dict[str, Any]:
895
867
  """Analyze readiness for effective searching."""
896
868
  search_analysis = {
897
869
  "semantic_ready_tables": [],
@@ -908,9 +880,7 @@ def _analyze_search_readiness(
908
880
  schema_result = db.describe_table(table_name)
909
881
  if schema_result.get("success"):
910
882
  columns = schema_result.get("columns", [])
911
- text_columns = [
912
- col for col in columns if "TEXT" in col.get("type", "").upper()
913
- ]
883
+ text_columns = [col for col in columns if "TEXT" in col.get("type", "").upper()]
914
884
 
915
885
  if text_columns:
916
886
  search_analysis["text_searchable_tables"].append(table_name)
@@ -923,13 +893,9 @@ def _analyze_search_readiness(
923
893
  search_analysis["embedding_coverage"][table_name] = coverage
924
894
 
925
895
  if coverage > 80:
926
- search_analysis["semantic_ready_tables"].append(
927
- table_name
928
- )
896
+ search_analysis["semantic_ready_tables"].append(table_name)
929
897
  elif len(text_columns) > 0:
930
- search_analysis["search_optimization_needed"].append(
931
- table_name
932
- )
898
+ search_analysis["search_optimization_needed"].append(table_name)
933
899
 
934
900
  except Exception:
935
901
  continue
@@ -950,15 +916,11 @@ def _generate_discovery_insights(
950
916
 
951
917
  # Goal-specific insights
952
918
  if discovery_goal == "understand_content":
953
- insights.append(
954
- f"Memory bank contains {total_tables} tables with {total_rows} total rows"
955
- )
919
+ insights.append(f"Memory bank contains {total_tables} tables with {total_rows} total rows")
956
920
 
957
921
  high_value_tables = overview.get("high_value_tables", [])
958
922
  if high_value_tables:
959
- insights.append(
960
- f"High-value content found in: {', '.join(high_value_tables[:3])}"
961
- )
923
+ insights.append(f"High-value content found in: {', '.join(high_value_tables[:3])}")
962
924
  recommendations.append(
963
925
  f"Focus search efforts on high-value tables: {', '.join(high_value_tables)}"
964
926
  )
@@ -974,9 +936,7 @@ def _generate_discovery_insights(
974
936
  elif discovery_goal == "find_patterns":
975
937
  text_rich_tables = overview.get("text_rich_tables", [])
976
938
  if text_rich_tables:
977
- insights.append(
978
- f"Text-rich content found in {len(text_rich_tables)} tables"
979
- )
939
+ insights.append(f"Text-rich content found in {len(text_rich_tables)} tables")
980
940
  next_steps.append("Use semantic search to find content patterns")
981
941
 
982
942
  quality_scores = overview.get("quality_scores", {})
@@ -1010,20 +970,14 @@ def _generate_discovery_insights(
1010
970
  next_steps.append("Use auto_semantic_search() for conceptual queries")
1011
971
 
1012
972
  if optimization_needed:
1013
- insights.append(
1014
- f"Search optimization needed for {len(optimization_needed)} tables"
1015
- )
1016
- next_steps.append(
1017
- f"Set up embeddings for: {', '.join(optimization_needed[:2])}"
1018
- )
973
+ insights.append(f"Search optimization needed for {len(optimization_needed)} tables")
974
+ next_steps.append(f"Set up embeddings for: {', '.join(optimization_needed[:2])}")
1019
975
 
1020
976
  # Universal recommendations
1021
977
  if overview.get("semantic_search_available"):
1022
978
  recommendations.append("Use auto_smart_search() for best search results")
1023
979
  else:
1024
- recommendations.append(
1025
- "Install sentence-transformers for semantic search capabilities"
1026
- )
980
+ recommendations.append("Install sentence-transformers for semantic search capabilities")
1027
981
 
1028
982
  if not next_steps:
1029
983
  next_steps.append("Use explore_tables() for detailed content examination")
@@ -1077,9 +1031,7 @@ def _store_discovery_pattern(db, discovery_session: Dict[str, Any]) -> None:
1077
1031
  try:
1078
1032
  # Check if discovery_patterns table exists
1079
1033
  tables_result = db.list_tables()
1080
- if tables_result.get("success") and "discovery_patterns" in tables_result.get(
1081
- "tables", []
1082
- ):
1034
+ if tables_result.get("success") and "discovery_patterns" in tables_result.get("tables", []):
1083
1035
  # Store the discovery session
1084
1036
  db.insert_row(
1085
1037
  "discovery_patterns",
@@ -1088,9 +1040,7 @@ def _store_discovery_pattern(db, discovery_session: Dict[str, Any]) -> None:
1088
1040
  "goal": discovery_session.get("goal"),
1089
1041
  "focus_area": discovery_session.get("focus_area"),
1090
1042
  "depth": discovery_session.get("depth"),
1091
- "steps_completed": str(
1092
- discovery_session.get("steps_completed", [])
1093
- ),
1043
+ "steps_completed": str(discovery_session.get("steps_completed", [])),
1094
1044
  "success": True,
1095
1045
  "timestamp": discovery_session.get("timestamp"),
1096
1046
  },
@@ -1156,20 +1106,13 @@ def _discover_foreign_keys(db, target_table: str, all_tables: List[str]) -> List
1156
1106
  col_name = col.get("name", "")
1157
1107
  # Look for naming patterns that suggest foreign keys
1158
1108
  if col_name.endswith("_id") or col_name.endswith("Id"):
1159
- potential_ref = col_name.replace("_id", "").replace(
1160
- "Id", ""
1161
- )
1162
- if (
1163
- potential_ref == target_table
1164
- or f"{potential_ref}s" == target_table
1165
- ):
1109
+ potential_ref = col_name.replace("_id", "").replace("Id", "")
1110
+ if potential_ref == target_table or f"{potential_ref}s" == target_table:
1166
1111
  relationships.append(f"{other_table}.{col_name}")
1167
1112
 
1168
1113
  # Look for exact column name matches (potential shared keys)
1169
1114
  if col_name in target_col_names and col_name != "id":
1170
- relationships.append(
1171
- f"{other_table}.{col_name} (shared key)"
1172
- )
1115
+ relationships.append(f"{other_table}.{col_name} (shared key)")
1173
1116
 
1174
1117
  except Exception:
1175
1118
  continue
@@ -1197,9 +1140,7 @@ def _discover_semantic_relationships(
1197
1140
 
1198
1141
  # Create a sample query from target table content
1199
1142
  sample_row = target_rows["rows"][0]
1200
- sample_text = " ".join(str(v) for v in sample_row.values() if v is not None)[
1201
- :200
1202
- ]
1143
+ sample_text = " ".join(str(v) for v in sample_row.values() if v is not None)[:200]
1203
1144
 
1204
1145
  if len(sample_text.strip()) < 10:
1205
1146
  return relationships
@@ -1223,9 +1164,9 @@ def _discover_semantic_relationships(
1223
1164
 
1224
1165
  if search_result.get("success") and search_result.get("results"):
1225
1166
  results = search_result["results"]
1226
- avg_similarity = sum(
1227
- r.get("similarity_score", 0) for r in results
1228
- ) / len(results)
1167
+ avg_similarity = sum(r.get("similarity_score", 0) for r in results) / len(
1168
+ results
1169
+ )
1229
1170
 
1230
1171
  if avg_similarity >= threshold:
1231
1172
  relationships.append(
@@ -1245,9 +1186,7 @@ def _discover_semantic_relationships(
1245
1186
  return relationships
1246
1187
 
1247
1188
 
1248
- def _discover_temporal_relationships(
1249
- db, target_table: str, all_tables: List[str]
1250
- ) -> List[str]:
1189
+ def _discover_temporal_relationships(db, target_table: str, all_tables: List[str]) -> List[str]:
1251
1190
  """Discover temporal pattern relationships."""
1252
1191
  relationships = []
1253
1192
 
@@ -1296,9 +1235,7 @@ def _discover_temporal_relationships(
1296
1235
  return relationships
1297
1236
 
1298
1237
 
1299
- def _discover_naming_relationships(
1300
- target_table: str, all_tables: List[str]
1301
- ) -> List[str]:
1238
+ def _discover_naming_relationships(target_table: str, all_tables: List[str]) -> List[str]:
1302
1239
  """Discover relationships based on naming conventions."""
1303
1240
  relationships = []
1304
1241
 
@@ -7,12 +7,11 @@ semantic search, embedding management, and intelligent search capabilities.
7
7
 
8
8
  import logging
9
9
  import traceback
10
- from typing import Any, Dict, List, Optional, cast
10
+ from typing import List, Optional, cast
11
11
 
12
12
  from ..database import get_database
13
- from ..types import MemoryBankError, DatabaseError, ToolResponse
13
+ from ..types import ToolResponse
14
14
  from ..utils import catch_errors
15
- from ..semantic import is_semantic_search_available
16
15
 
17
16
 
18
17
  @catch_errors
@@ -24,9 +23,7 @@ def search_content(
24
23
  """Perform full-text search across table content using natural language queries."""
25
24
  from .. import server
26
25
 
27
- return cast(
28
- ToolResponse, get_database(server.DB_PATH).search_content(query, tables, limit)
29
- )
26
+ return cast(ToolResponse, get_database(server.DB_PATH).search_content(query, tables, limit))
30
27
 
31
28
 
32
29
  @catch_errors
@@ -228,10 +225,7 @@ def auto_semantic_search(
228
225
  columns = schema_result.get("columns", [])
229
226
  if isinstance(columns, list):
230
227
  for col in columns:
231
- if (
232
- isinstance(col, dict)
233
- and "TEXT" in col.get("type", "").upper()
234
- ):
228
+ if isinstance(col, dict) and "TEXT" in col.get("type", "").upper():
235
229
  text_columns.append(col["name"])
236
230
 
237
231
  # Auto-embed text columns
@@ -365,10 +359,7 @@ def auto_smart_search(
365
359
  columns = schema_result.get("columns", [])
366
360
  if isinstance(columns, list):
367
361
  for col in columns:
368
- if (
369
- isinstance(col, dict)
370
- and "TEXT" in col.get("type", "").upper()
371
- ):
362
+ if isinstance(col, dict) and "TEXT" in col.get("type", "").upper():
372
363
  text_columns.append(col["name"])
373
364
 
374
365
  # Auto-embed text columns
@@ -397,9 +388,7 @@ def auto_smart_search(
397
388
  )
398
389
  except Exception as search_error:
399
390
  # If hybrid search fails, fall back to regular content search
400
- logging.warning(
401
- f"Hybrid search failed, falling back to content search: {search_error}"
402
- )
391
+ logging.warning(f"Hybrid search failed, falling back to content search: {search_error}")
403
392
  try:
404
393
  fallback_result = get_database(server.DB_PATH).search_content(
405
394
  query, search_tables, limit
@@ -110,9 +110,7 @@ def get_table_columns(conn: sqlite3.Connection, table_name: str) -> List[str]:
110
110
  cur.execute(f"PRAGMA table_info({table_name})")
111
111
  columns = [row[1] for row in cur.fetchall()]
112
112
  if not columns:
113
- raise SchemaError(
114
- f"Table does not exist: {table_name}", {"table_name": table_name}
115
- )
113
+ raise SchemaError(f"Table does not exist: {table_name}", {"table_name": table_name})
116
114
  return columns
117
115
 
118
116
 
@@ -164,13 +162,9 @@ def validate_table_exists(conn: sqlite3.Connection, table_name: str) -> None:
164
162
  table_name: Name of table to check
165
163
  """
166
164
  cur = conn.cursor()
167
- cur.execute(
168
- "SELECT name FROM sqlite_master WHERE type='table' AND name=?", (table_name,)
169
- )
165
+ cur.execute("SELECT name FROM sqlite_master WHERE type='table' AND name=?", (table_name,))
170
166
  if not cur.fetchone():
171
- raise SchemaError(
172
- f"Table does not exist: {table_name}", {"table_name": table_name}
173
- )
167
+ raise SchemaError(f"Table does not exist: {table_name}", {"table_name": table_name})
174
168
 
175
169
 
176
170
  def build_where_clause(
@@ -229,7 +223,6 @@ def suggest_recovery(error: Exception, function_name: str) -> Dict[str, Any]:
229
223
  }
230
224
 
231
225
  error_str = str(error).lower()
232
- error_type = type(error).__name__
233
226
 
234
227
  # Dependency-related errors
235
228
  if "sentence-transformers" in error_str or "transformers" in error_str:
@@ -382,9 +375,7 @@ def enhanced_catch_errors(
382
375
 
383
376
  # Determine error category
384
377
  if isinstance(e, MemoryBankError):
385
- category = (
386
- e.category.name if hasattr(e, "category") else "MEMORY_BANK"
387
- )
378
+ category = e.category.name if hasattr(e, "category") else "MEMORY_BANK"
388
379
  return cast(
389
380
  ToolResponse,
390
381
  {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp_sqlite_memory_bank
3
- Version: 1.6.0
3
+ Version: 1.6.2
4
4
  Summary: A dynamic, agent/LLM-friendly SQLite memory bank for MCP servers with semantic search capabilities.
5
5
  Author-email: Robert Meisner <robert@catchit.pl>
6
6
  License-Expression: MIT
@@ -0,0 +1,21 @@
1
+ mcp_sqlite_memory_bank/__init__.py,sha256=nM63WzpIHto4Xc5pEMVW0xuJ4g5K1Y76M2mnPupV0x0,2795
2
+ mcp_sqlite_memory_bank/__main__.py,sha256=tPbJP9vC6V_2lLOGiiHof-katnc0FXcRqcRWk4SstZ0,2014
3
+ mcp_sqlite_memory_bank/database.py,sha256=pxnhtjglDXOHy-DVpzjgsYTRGjHlJ3V3I7MBNrMULfs,49277
4
+ mcp_sqlite_memory_bank/prompts.py,sha256=cZixeyqSirMwCKBfTHJMfYEFh4xzEf6V_M3QFSuTWdM,11769
5
+ mcp_sqlite_memory_bank/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ mcp_sqlite_memory_bank/resources.py,sha256=6rZfpPtS5gEu2WIaQJUxgxFsDqgQYcNtkv3kVxFX4jA,22972
7
+ mcp_sqlite_memory_bank/semantic.py,sha256=W71SHC44qpptcCYklR8T2shChtdTHrDb8VlIxMu4PLc,15650
8
+ mcp_sqlite_memory_bank/server.py,sha256=tY_7Uam30NUo-I5VT2LQ-XK3N6JVkAnoIZ5vxvTBxWM,49423
9
+ mcp_sqlite_memory_bank/types.py,sha256=kK8HUz3szwiV9cUJkO56RpnosXEssQT1t0w_166ik5k,6756
10
+ mcp_sqlite_memory_bank/utils.py,sha256=rTJ1PI2uBQw9h7RT4EAcRLYV2HQIuaxFGmqAd1CKRig,15064
11
+ mcp_sqlite_memory_bank/tools/__init__.py,sha256=00TDY78qXLdeaXxcK53xFKlEiY9flHQCuIGnEh5rghg,1786
12
+ mcp_sqlite_memory_bank/tools/analytics.py,sha256=lGvXZbmPR26l96iRibAeZ--O9ykxs05XZZRXefe8MKk,19583
13
+ mcp_sqlite_memory_bank/tools/basic.py,sha256=k_ypt1qfcbekz829uvegydTr9ZkEiuSgwCZUjKRMzs4,19082
14
+ mcp_sqlite_memory_bank/tools/discovery.py,sha256=_Y9dHKSA00qLUodcb80Cm1mmCM5Uh3C-4MCzD_rEoYI,56059
15
+ mcp_sqlite_memory_bank/tools/search.py,sha256=NXBrKsOJD3vaWM0jAc7M9DnI--IveCNEnq-DnfphVhA,16993
16
+ mcp_sqlite_memory_bank-1.6.2.dist-info/licenses/LICENSE,sha256=KPr7eFgCJqQIjeSAcwRafbjcgm-10zkrJ7MFoTOGJQg,1092
17
+ mcp_sqlite_memory_bank-1.6.2.dist-info/METADATA,sha256=X_OWksy928VPc5SmQlXTv3MGpgqrqkxSdD20iwYQX4s,35536
18
+ mcp_sqlite_memory_bank-1.6.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ mcp_sqlite_memory_bank-1.6.2.dist-info/entry_points.txt,sha256=S9yGWiCe8f_rgcGCgbwEAX2FfJ9jXWxcc4K4Jenbcn8,150
20
+ mcp_sqlite_memory_bank-1.6.2.dist-info/top_level.txt,sha256=xQ8MTGECpWMR-9DV4H8mMqaSoZqE-C8EvpOg9E2U1wM,23
21
+ mcp_sqlite_memory_bank-1.6.2.dist-info/RECORD,,
@@ -1,21 +0,0 @@
1
- mcp_sqlite_memory_bank/__init__.py,sha256=watSgbtYk6AHB57GzJ09w_KXSPMqnyKFRk6cnQ5hCF0,2795
2
- mcp_sqlite_memory_bank/__main__.py,sha256=AZ6JPKw1C2hM2MdB6opAysXFFGaO5aXcLbkMVNlxzxU,2110
3
- mcp_sqlite_memory_bank/database.py,sha256=NadWM9QB_5TOVmtKBHwZSJjIdg4KD0TiTBn9oU4tjyw,50489
4
- mcp_sqlite_memory_bank/prompts.py,sha256=x9EfzAaWPXlpblM2cDyPV5xuG0Q3pjXmT64g1TVQ5RM,11901
5
- mcp_sqlite_memory_bank/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- mcp_sqlite_memory_bank/resources.py,sha256=GF_Lqr-Of6e0R2ZauCASdlfafQxZUzCHKrIU6aLkmyI,23720
7
- mcp_sqlite_memory_bank/semantic.py,sha256=ZxYmZetn_bvqE-bW6Sy_MMpsKhXnO4KgplgVO5CvHNQ,16021
8
- mcp_sqlite_memory_bank/server.py,sha256=V3dLdsKSJcQCWWSN_VFchHeDmxF3xfW2aA0VI8k3qps,49694
9
- mcp_sqlite_memory_bank/types.py,sha256=kK8HUz3szwiV9cUJkO56RpnosXEssQT1t0w_166ik5k,6756
10
- mcp_sqlite_memory_bank/utils.py,sha256=08sdnEBLFhaGg3zrqOFPkLdv2ZnTZ8ggWe-ILysNlDk,15217
11
- mcp_sqlite_memory_bank/tools/__init__.py,sha256=00TDY78qXLdeaXxcK53xFKlEiY9flHQCuIGnEh5rghg,1786
12
- mcp_sqlite_memory_bank/tools/analytics.py,sha256=B7Rc1t6Imf7cC4NRgjGETYdSrfMt5wqE7plr-UpaC-k,20530
13
- mcp_sqlite_memory_bank/tools/basic.py,sha256=TSoleUkDwizaE2A4r3G2g92rNTOImXV5inhy8sBfnFQ,18414
14
- mcp_sqlite_memory_bank/tools/discovery.py,sha256=NIYY-UX5OfzE0pLGToHF9j9KvBPzWOPM3DR3J-afWzo,57290
15
- mcp_sqlite_memory_bank/tools/search.py,sha256=5Nek8xWPtlcBlVcHM4tDeZ1wiUxX_ispwaDOB5k6sAo,17311
16
- mcp_sqlite_memory_bank-1.6.0.dist-info/licenses/LICENSE,sha256=KPr7eFgCJqQIjeSAcwRafbjcgm-10zkrJ7MFoTOGJQg,1092
17
- mcp_sqlite_memory_bank-1.6.0.dist-info/METADATA,sha256=wbjNDb6LCETv8OqYiowtKObEzskMl1k6WwG87vPO8Q4,35536
18
- mcp_sqlite_memory_bank-1.6.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
- mcp_sqlite_memory_bank-1.6.0.dist-info/entry_points.txt,sha256=S9yGWiCe8f_rgcGCgbwEAX2FfJ9jXWxcc4K4Jenbcn8,150
20
- mcp_sqlite_memory_bank-1.6.0.dist-info/top_level.txt,sha256=xQ8MTGECpWMR-9DV4H8mMqaSoZqE-C8EvpOg9E2U1wM,23
21
- mcp_sqlite_memory_bank-1.6.0.dist-info/RECORD,,