mcp-sqlite-memory-bank 1.5.1__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.
@@ -14,7 +14,13 @@ import traceback
14
14
  from datetime import datetime
15
15
  from functools import wraps
16
16
  from typing import Any, Callable, Dict, List, TypeVar, cast, Union, Tuple
17
- from .types import ValidationError, DatabaseError, SchemaError, MemoryBankError, ToolResponse
17
+ from .types import (
18
+ ValidationError,
19
+ DatabaseError,
20
+ SchemaError,
21
+ MemoryBankError,
22
+ ToolResponse,
23
+ )
18
24
 
19
25
  T = TypeVar("T", bound=Callable[..., ToolResponse])
20
26
 
@@ -35,11 +41,17 @@ def catch_errors(f: T) -> T:
35
41
  except sqlite3.Error as e:
36
42
  logging.error(f"{f.__name__} database error: {e}")
37
43
  return cast(
38
- ToolResponse, DatabaseError(f"Database error in {f.__name__}: {e}", {"sqlite_error": str(e)}).to_dict()
44
+ ToolResponse,
45
+ DatabaseError(
46
+ f"Database error in {f.__name__}: {e}", {"sqlite_error": str(e)}
47
+ ).to_dict(),
39
48
  )
40
49
  except Exception as e:
41
50
  logging.error(f"Unexpected error in {f.__name__}: {e}")
42
- return cast(ToolResponse, DatabaseError(f"Unexpected error in {f.__name__}: {e}").to_dict())
51
+ return cast(
52
+ ToolResponse,
53
+ DatabaseError(f"Unexpected error in {f.__name__}: {e}").to_dict(),
54
+ )
43
55
 
44
56
  return cast(T, wrapper)
45
57
 
@@ -70,7 +82,9 @@ def validate_column_definition(column: Dict[str, Any]) -> None:
70
82
  column: Dictionary with column definition (must have 'name' and 'type' keys)
71
83
  """
72
84
  if not isinstance(column, dict):
73
- raise ValidationError("Column definition must be a dictionary", {"received": str(type(column))})
85
+ raise ValidationError(
86
+ "Column definition must be a dictionary", {"received": str(type(column))}
87
+ )
74
88
  if "name" not in column or "type" not in column:
75
89
  raise ValidationError(
76
90
  "Column definition must have 'name' and 'type' keys",
@@ -118,9 +132,15 @@ def get_table_columns_by_name(table_name: str) -> Union[List[str], Dict[str, Any
118
132
  validate_identifier(table_name, "table name")
119
133
  with sqlite3.connect(os.environ.get("DB_PATH", "./test.db")) as conn:
120
134
  cur = conn.cursor()
121
- cur.execute("SELECT name FROM sqlite_master WHERE type='table' AND name=?", (table_name,))
135
+ cur.execute(
136
+ "SELECT name FROM sqlite_master WHERE type='table' AND name=?",
137
+ (table_name,),
138
+ )
122
139
  if not cur.fetchone():
123
- return {"success": False, "error": f"Table '{table_name}' does not exist"}
140
+ return {
141
+ "success": False,
142
+ "error": f"Table '{table_name}' does not exist",
143
+ }
124
144
 
125
145
  # Get column information
126
146
  cur.execute(f"PRAGMA table_info({table_name})")
@@ -147,7 +167,9 @@ def validate_table_exists(conn: sqlite3.Connection, table_name: str) -> None:
147
167
  raise SchemaError(f"Table does not exist: {table_name}", {"table_name": table_name})
148
168
 
149
169
 
150
- def build_where_clause(where: Dict[str, Any], valid_columns: List[str]) -> Union[Tuple[str, list], Dict[str, Any]]:
170
+ def build_where_clause(
171
+ where: Dict[str, Any], valid_columns: List[str]
172
+ ) -> Union[Tuple[str, List[Any]], Dict[str, Any]]:
151
173
  """
152
174
  Build a WHERE clause from a dictionary of column-value pairs.
153
175
 
@@ -168,7 +190,10 @@ def build_where_clause(where: Dict[str, Any], valid_columns: List[str]) -> Union
168
190
 
169
191
  for col, val in where.items():
170
192
  if col not in valid_columns:
171
- return {"success": False, "error": f"Invalid column in where clause: {col}"}
193
+ return {
194
+ "success": False,
195
+ "error": f"Invalid column in where clause: {col}",
196
+ }
172
197
  conditions.append(f"{col}=?")
173
198
  values.append(val)
174
199
 
@@ -194,114 +219,127 @@ def suggest_recovery(error: Exception, function_name: str) -> Dict[str, Any]:
194
219
  "auto_recovery_available": False,
195
220
  "manual_steps": [],
196
221
  "documentation_links": [],
197
- "similar_errors": []
222
+ "similar_errors": [],
198
223
  }
199
224
 
200
225
  error_str = str(error).lower()
201
- error_type = type(error).__name__
202
226
 
203
227
  # Dependency-related errors
204
228
  if "sentence-transformers" in error_str or "transformers" in error_str:
205
- suggestions.update({
206
- "auto_recovery_available": True,
207
- "install_command": "pip install sentence-transformers",
208
- "manual_steps": [
209
- "Install sentence-transformers: pip install sentence-transformers",
210
- "Restart the MCP server",
211
- "Try the semantic search operation again"
212
- ],
213
- "explanation": "Semantic search requires the sentence-transformers library",
214
- "fallback_available": "Keyword search is available as fallback"
215
- })
229
+ suggestions.update(
230
+ {
231
+ "auto_recovery_available": True,
232
+ "install_command": "pip install sentence-transformers",
233
+ "manual_steps": [
234
+ "Install sentence-transformers: pip install sentence-transformers",
235
+ "Restart the MCP server",
236
+ "Try the semantic search operation again",
237
+ ],
238
+ "explanation": "Semantic search requires the sentence-transformers library",
239
+ "fallback_available": "Keyword search is available as fallback",
240
+ }
241
+ )
216
242
 
217
243
  # Database errors
218
244
  elif "database" in error_str or "sqlite" in error_str:
219
- suggestions.update({
220
- "manual_steps": [
221
- "Check if database file exists and is writable",
222
- "Verify disk space is available",
223
- "Check if another process is using the database",
224
- "Try creating a new database file"
225
- ],
226
- "auto_recovery_available": False,
227
- "diagnostics": {
228
- "check_db_path": "Verify DB_PATH environment variable",
229
- "check_permissions": "Ensure write permissions to database directory"
245
+ suggestions.update(
246
+ {
247
+ "manual_steps": [
248
+ "Check if database file exists and is writable",
249
+ "Verify disk space is available",
250
+ "Check if another process is using the database",
251
+ "Try creating a new database file",
252
+ ],
253
+ "auto_recovery_available": False,
254
+ "diagnostics": {
255
+ "check_db_path": "Verify DB_PATH environment variable",
256
+ "check_permissions": "Ensure write permissions to database directory",
257
+ },
230
258
  }
231
- })
259
+ )
232
260
 
233
261
  # Table/schema errors
234
262
  elif "table" in error_str and ("not exist" in error_str or "missing" in error_str):
235
- suggestions.update({
236
- "auto_recovery_available": True,
237
- "manual_steps": [
238
- "List available tables with list_tables()",
239
- "Check table name spelling",
240
- "Create the table if it doesn't exist",
241
- "Refresh your table list"
242
- ],
243
- "next_actions": ["call list_tables() to see available tables"]
244
- })
263
+ suggestions.update(
264
+ {
265
+ "auto_recovery_available": True,
266
+ "manual_steps": [
267
+ "List available tables with list_tables()",
268
+ "Check table name spelling",
269
+ "Create the table if it doesn't exist",
270
+ "Refresh your table list",
271
+ ],
272
+ "next_actions": ["call list_tables() to see available tables"],
273
+ }
274
+ )
245
275
 
246
276
  # Column errors
247
277
  elif "column" in error_str and ("not exist" in error_str or "invalid" in error_str):
248
- suggestions.update({
249
- "auto_recovery_available": True,
250
- "manual_steps": [
251
- "Use describe_table() to see available columns",
252
- "Check column name spelling and case",
253
- "Verify the column exists in the table schema"
254
- ],
255
- "next_actions": ["call describe_table() to see column schema"]
256
- })
278
+ suggestions.update(
279
+ {
280
+ "auto_recovery_available": True,
281
+ "manual_steps": [
282
+ "Use describe_table() to see available columns",
283
+ "Check column name spelling and case",
284
+ "Verify the column exists in the table schema",
285
+ ],
286
+ "next_actions": ["call describe_table() to see column schema"],
287
+ }
288
+ )
257
289
 
258
290
  # Import/module errors
259
291
  elif "import" in error_str or "module" in error_str:
260
- suggestions.update({
261
- "manual_steps": [
262
- "Check if required packages are installed",
263
- "Verify Python environment is correct",
264
- "Try reinstalling the package",
265
- "Check for version compatibility issues"
266
- ],
267
- "diagnostics": {
268
- "python_version": sys.version,
269
- "check_packages": "pip list | grep -E '(torch|transformers|sentence)'"
292
+ suggestions.update(
293
+ {
294
+ "manual_steps": [
295
+ "Check if required packages are installed",
296
+ "Verify Python environment is correct",
297
+ "Try reinstalling the package",
298
+ "Check for version compatibility issues",
299
+ ],
300
+ "diagnostics": {
301
+ "python_version": sys.version,
302
+ "check_packages": "pip list | grep -E '(torch|transformers|sentence)'",
303
+ },
270
304
  }
271
- })
305
+ )
272
306
 
273
307
  # Function/method errors (like our recent 'FunctionTool' issue)
274
308
  elif "not callable" in error_str or "has no attribute" in error_str:
275
- suggestions.update({
276
- "manual_steps": [
277
- "Check if you're using the correct function/method name",
278
- "Verify the object type is what you expect",
279
- "Check for import issues or namespace conflicts",
280
- "Try restarting the MCP server"
281
- ],
282
- "diagnostics": {
283
- "object_type": "Check the actual type of the object being called",
284
- "namespace_check": "Verify imports and module loading"
285
- },
286
- "likely_causes": [
287
- "Using PyPI version instead of local development code",
288
- "Import conflicts between different module versions",
289
- "Object not properly initialized"
290
- ]
291
- })
309
+ suggestions.update(
310
+ {
311
+ "manual_steps": [
312
+ "Check if you're using the correct function/method name",
313
+ "Verify the object type is what you expect",
314
+ "Check for import issues or namespace conflicts",
315
+ "Try restarting the MCP server",
316
+ ],
317
+ "diagnostics": {
318
+ "object_type": "Check the actual type of the object being called",
319
+ "namespace_check": "Verify imports and module loading",
320
+ },
321
+ "likely_causes": [
322
+ "Using PyPI version instead of local development code",
323
+ "Import conflicts between different module versions",
324
+ "Object not properly initialized",
325
+ ],
326
+ }
327
+ )
292
328
 
293
329
  # Add context-specific suggestions
294
330
  if function_name.startswith("semantic") or function_name.startswith("embedding"):
295
331
  suggestions["context_help"] = {
296
332
  "semantic_search_help": "Semantic search requires sentence-transformers and embeddings to be generated",
297
333
  "embedding_help": "Use add_embeddings() and generate_embeddings() before semantic search",
298
- "fallback_option": "Consider using search_content() for keyword-based search"
334
+ "fallback_option": "Consider using search_content() for keyword-based search",
299
335
  }
300
336
 
301
337
  return suggestions
302
338
 
303
339
 
304
- def enhanced_catch_errors(include_traceback: bool = False, auto_recovery: bool = True):
340
+ def enhanced_catch_errors(
341
+ include_traceback: bool = False, auto_recovery: bool = True
342
+ ) -> Callable[[Callable[..., Any]], Callable[..., Any]]:
305
343
  """
306
344
  Enhanced error decorator with debugging context and auto-recovery suggestions.
307
345
 
@@ -309,6 +347,7 @@ def enhanced_catch_errors(include_traceback: bool = False, auto_recovery: bool =
309
347
  include_traceback: Whether to include full traceback in error details
310
348
  auto_recovery: Whether to include auto-recovery suggestions
311
349
  """
350
+
312
351
  def decorator(f: T) -> T:
313
352
  @wraps(f)
314
353
  def wrapper(*args: Any, **kwargs: Any) -> ToolResponse:
@@ -322,7 +361,7 @@ def enhanced_catch_errors(include_traceback: bool = False, auto_recovery: bool =
322
361
  "args_preview": str(args)[:200], # Truncate for safety
323
362
  "kwargs_preview": {k: str(v)[:100] for k, v in kwargs.items()},
324
363
  "python_version": sys.version,
325
- "error_type": type(e).__name__
364
+ "error_type": type(e).__name__,
326
365
  }
327
366
 
328
367
  # Add traceback if requested
@@ -336,30 +375,40 @@ def enhanced_catch_errors(include_traceback: bool = False, auto_recovery: bool =
336
375
 
337
376
  # Determine error category
338
377
  if isinstance(e, MemoryBankError):
339
- category = e.category.name if hasattr(e, 'category') else "MEMORY_BANK"
340
- return cast(ToolResponse, {
341
- "success": False,
342
- "error": str(e),
343
- "category": category,
344
- "details": error_context,
345
- "recovery": recovery_suggestions
346
- })
378
+ category = e.category.name if hasattr(e, "category") else "MEMORY_BANK"
379
+ return cast(
380
+ ToolResponse,
381
+ {
382
+ "success": False,
383
+ "error": str(e),
384
+ "category": category,
385
+ "details": error_context,
386
+ "recovery": recovery_suggestions,
387
+ },
388
+ )
347
389
  elif isinstance(e, sqlite3.Error):
348
- return cast(ToolResponse, {
349
- "success": False,
350
- "error": f"Database error: {str(e)}",
351
- "category": "DATABASE",
352
- "details": error_context,
353
- "recovery": recovery_suggestions
354
- })
390
+ return cast(
391
+ ToolResponse,
392
+ {
393
+ "success": False,
394
+ "error": f"Database error: {str(e)}",
395
+ "category": "DATABASE",
396
+ "details": error_context,
397
+ "recovery": recovery_suggestions,
398
+ },
399
+ )
355
400
  else:
356
- return cast(ToolResponse, {
357
- "success": False,
358
- "error": f"Unexpected error: {str(e)}",
359
- "category": "SYSTEM",
360
- "details": error_context,
361
- "recovery": recovery_suggestions
362
- })
401
+ return cast(
402
+ ToolResponse,
403
+ {
404
+ "success": False,
405
+ "error": f"Unexpected error: {str(e)}",
406
+ "category": "SYSTEM",
407
+ "details": error_context,
408
+ "recovery": recovery_suggestions,
409
+ },
410
+ )
363
411
 
364
412
  return cast(T, wrapper)
413
+
365
414
  return decorator
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp_sqlite_memory_bank
3
- Version: 1.5.1
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
@@ -9,13 +9,13 @@ Project-URL: Source, https://github.com/robertmeisner/mcp_sqlite_memory_bank
9
9
  Project-URL: Issues, https://github.com/robertmeisner/mcp_sqlite_memory_bank/issues
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Operating System :: OS Independent
12
- Requires-Python: >=3.8
12
+ Requires-Python: >=3.10
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: fastapi>=0.100.0
16
16
  Requires-Dist: uvicorn>=0.22.0
17
17
  Requires-Dist: pydantic>=1.10.0
18
- Requires-Dist: fastmcp
18
+ Requires-Dist: fastmcp>=2.9.0
19
19
  Requires-Dist: sqlalchemy>=2.0.0
20
20
  Requires-Dist: sentence-transformers>=2.2.0
21
21
  Requires-Dist: torch>=1.9.0
@@ -126,10 +126,10 @@ Restart your IDE and try asking your AI assistant:
126
126
 
127
127
  SQLite Memory Bank v1.4.0+ provides full Model Context Protocol (MCP) compliance with advanced features for enhanced LLM and agent integration:
128
128
 
129
- ### 🔧 MCP Tools (20 Available)
129
+ ### 🔧 MCP Tools (23 Available)
130
130
  Organized into logical categories for easy discovery:
131
131
  - **Schema Management** (6 tools): Table creation, modification, and inspection
132
- - **Data Operations** (5 tools): CRUD operations with validation
132
+ - **Data Operations** (8 tools): CRUD operations with validation and batch processing
133
133
  - **Search & Discovery** (2 tools): Content search and exploration
134
134
  - **Semantic Search** (5 tools): AI-powered natural language content discovery
135
135
  - **Analytics** (2 tools): Memory bank insights and statistics
@@ -175,7 +175,7 @@ All tools are designed for explicit, discoverable use by LLMs, agents, and devel
175
175
  | `describe_table` | Get schema details | `table_name` (str) | None |
176
176
  | `list_all_columns` | List all columns for all tables | None | None |
177
177
 
178
- ### Data Operations Tools (5 tools)
178
+ ### Data Operations Tools (8 tools)
179
179
 
180
180
  | Tool | Description | Required Parameters | Optional Parameters |
181
181
  |------|-------------|---------------------|---------------------|
@@ -184,6 +184,9 @@ All tools are designed for explicit, discoverable use by LLMs, agents, and devel
184
184
  | `update_rows` | Update existing rows | `table_name` (str), `data` (dict), `where` (dict) | None |
185
185
  | `delete_rows` | Delete rows from table | `table_name` (str), `where` (dict) | None |
186
186
  | `run_select_query` | Run safe SELECT query | `table_name` (str) | `columns` (list[str]), `where` (dict), `limit` (int) |
187
+ | `upsert_memory` | Smart update or create memory record | `table_name` (str), `data` (dict), `match_columns` (list[str]) | None |
188
+ | `batch_create_memories` | Efficiently create multiple memory records | `table_name` (str), `data_list` (list[dict]) | `match_columns` (list[str]), `use_upsert` (bool) |
189
+ | `batch_delete_memories` | Delete multiple memory records efficiently | `table_name` (str), `conditions_list` (list[dict]) | `match_mode` (str) |
187
190
 
188
191
  ### Search & Discovery Tools (2 tools)
189
192
 
@@ -211,6 +214,51 @@ All tools are designed for explicit, discoverable use by LLMs, agents, and devel
211
214
 
212
215
  Each tool validates inputs and returns consistent response formats with success/error indicators and appropriate data payloads.
213
216
 
217
+ ## 🚀 Batch Operations & Smart Memory Management
218
+
219
+ SQLite Memory Bank provides powerful batch operations for efficient memory management:
220
+
221
+ ### Smart Memory Updates
222
+ - **`upsert_memory`**: Intelligent update-or-create for preventing duplicates
223
+ - **Duplicate Prevention**: Uses match columns to find existing records
224
+ - **Flexible Matching**: Specify which columns to match for finding existing records
225
+
226
+ ### Efficient Batch Processing
227
+ - **`batch_create_memories`**: Create multiple records in a single operation
228
+ - **Smart vs Fast Modes**: Choose between upsert logic (prevents duplicates) or fast insertion
229
+ - **Partial Success Handling**: Continues processing even if some records fail
230
+ - **Detailed Feedback**: Returns counts for created, updated, and failed records
231
+
232
+ ### Flexible Batch Deletion
233
+ - **`batch_delete_memories`**: Delete multiple records with complex conditions
234
+ - **Flexible Matching**: Support for OR (match_any) and AND (match_all) logic
235
+ - **Condition Lists**: Delete based on multiple different criteria
236
+ - **Safe Operations**: Validates conditions before deletion
237
+
238
+ ### Usage Examples
239
+
240
+ ```python
241
+ # Smart memory upsert - prevents duplicates
242
+ upsert_memory('technical_decisions', {
243
+ 'decision_name': 'API Design',
244
+ 'chosen_approach': 'REST APIs',
245
+ 'rationale': 'Better discoverability for LLMs'
246
+ }, match_columns=['decision_name'])
247
+
248
+ # Batch create with duplicate prevention
249
+ batch_create_memories('project_insights', [
250
+ {'category': 'performance', 'insight': 'Database indexing'},
251
+ {'category': 'security', 'insight': 'Input validation'},
252
+ {'category': 'architecture', 'insight': 'Microservice patterns'}
253
+ ], match_columns=['category', 'insight'], use_upsert=True)
254
+
255
+ # Batch delete with flexible conditions
256
+ batch_delete_memories('old_notes', [
257
+ {'status': 'archived'},
258
+ {'created_date': '2023-01-01', 'priority': 'low'}
259
+ ], match_mode='match_any') # Delete if ANY condition matches
260
+ ```
261
+
214
262
  ---
215
263
 
216
264
  ## Transport Modes
@@ -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=XHBjR2IbhTdlXtGCCUSM-4M1y-SIVTMIVx3iQXWSd14,2796
2
- mcp_sqlite_memory_bank/__main__.py,sha256=MkEV9A5JNAi4Pt5zbKM0qguPN5v8a0GXSS0OqXeDzVM,2040
3
- mcp_sqlite_memory_bank/database.py,sha256=E-GZ150XWgimgAi3LbATz2WlrzhOd1OcMhkuQip3BkI,46489
4
- mcp_sqlite_memory_bank/prompts.py,sha256=nLY6rf08wU5TeSLoSxjTlwcU_OIiJeOIkJYDQM_PFpo,11762
5
- mcp_sqlite_memory_bank/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- mcp_sqlite_memory_bank/resources.py,sha256=ozk0GYTwDxITWrUiOE735hn1v17kf8lJwIe9V1o2fb8,21680
7
- mcp_sqlite_memory_bank/semantic.py,sha256=LTZWBnENx6G1QGqppMLanikAC_bXGjEMB79ojU6rjDg,15349
8
- mcp_sqlite_memory_bank/server.py,sha256=YC4n_0yXrToLquCZE6iyLp_AdQUzCCNixYZm384fQno,43710
9
- mcp_sqlite_memory_bank/types.py,sha256=Lr6RVUUrdDdHUod6IvxLFaWg3H2uezL9luL8pYKxahM,6692
10
- mcp_sqlite_memory_bank/utils.py,sha256=1sNMlqpauqezDMd4uvjl_31qANm4K9C6HP4pGWo1Pxg,13963
11
- mcp_sqlite_memory_bank/tools/__init__.py,sha256=hLOaeSndOAmeXGPYZmdwpnPEwE8nCqKKAaDWFENDsyE,1807
12
- mcp_sqlite_memory_bank/tools/analytics.py,sha256=iTWZ5CVUiw3itdwvY8XEjnw8uwEYInO11LnVQU1UBas,19470
13
- mcp_sqlite_memory_bank/tools/basic.py,sha256=6wB6r_n67WLWYGTHlpgUfTT7uFZPeAFJOX3Ly0flgyg,3604
14
- mcp_sqlite_memory_bank/tools/discovery.py,sha256=pHwM0P2ffef3_MHFIehnWHRWzWz0vNGI8wZDN9IgVwg,53327
15
- mcp_sqlite_memory_bank/tools/search.py,sha256=SZhxtP0t_dUr3ttIEl6CDUFcdKESVcPQSBeCpBDD250,16176
16
- mcp_sqlite_memory_bank-1.5.1.dist-info/licenses/LICENSE,sha256=KPr7eFgCJqQIjeSAcwRafbjcgm-10zkrJ7MFoTOGJQg,1092
17
- mcp_sqlite_memory_bank-1.5.1.dist-info/METADATA,sha256=rrGClHtmpAGrRD2fXJOa917MjGGx4dlRvPWsc27DiF4,33094
18
- mcp_sqlite_memory_bank-1.5.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
- mcp_sqlite_memory_bank-1.5.1.dist-info/entry_points.txt,sha256=S9yGWiCe8f_rgcGCgbwEAX2FfJ9jXWxcc4K4Jenbcn8,150
20
- mcp_sqlite_memory_bank-1.5.1.dist-info/top_level.txt,sha256=xQ8MTGECpWMR-9DV4H8mMqaSoZqE-C8EvpOg9E2U1wM,23
21
- mcp_sqlite_memory_bank-1.5.1.dist-info/RECORD,,