Skip to main content
Glama
MIGRATION.md7.07 kB
# MCP Personal Assistant Migration Guide ## Database Migration ### Migrating from TinyDB to SQLite If you started with TinyDB and want to switch to SQLite for better performance: 1. **Export data from TinyDB**: ```python # export_data.py import json from src.tinydb_database import TinyDBDatabase # Initialize TinyDB db = TinyDBDatabase("path/to/tinydb.json") # Export all data export_data = { "status": db.get_status().model_dump(), "projects": [p.model_dump() for p in db.list_projects()], "todos": [t.model_dump() for t in db.list_todos()], "events": [e.model_dump() for e in db.list_events()], "documents": [d.model_dump() for d in db.list_documents()] } # Save to file with open("export.json", "w") as f: json.dump(export_data, f, indent=2, default=str) ``` 2. **Import data to SQLite**: ```python # import_data.py import json from datetime import datetime from src.sqlite_database import SQLiteDatabase from src.models import UserStatus, Project, Todo, CalendarEvent, Document # Load exported data with open("export.json", "r") as f: data = json.load(f) # Initialize SQLite db = SQLiteDatabase("path/to/sqlite.db") # Import status if "status" in data: status = UserStatus(**data["status"]) db.update_status(status) # Import projects for project_data in data.get("projects", []): project = Project(**project_data) db.create_project(project) # Import todos for todo_data in data.get("todos", []): todo = Todo(**todo_data) db.create_todo(todo) # Import events for event_data in data.get("events", []): # Convert date strings to datetime objects event_data["start_time"] = datetime.fromisoformat(event_data["start_time"]) event_data["end_time"] = datetime.fromisoformat(event_data["end_time"]) event = CalendarEvent(**event_data) db.create_event(event) # Import documents for doc_data in data.get("documents", []): document = Document(**doc_data) db.create_document(document) ``` 3. **Update configuration**: ```bash export MCP_PA_DB_TYPE=sqlite export MCP_PA_DB_PATH=/path/to/sqlite.db ``` ### Adding Encryption to Existing Database To add encryption to an existing database: 1. **For TinyDB**: ```bash # First, backup your database cp database.json database.json.backup # Set encryption key export MCP_PA_ENCRYPTION_KEY="your-secure-key" # Run migration script python migrate_encrypt.py ``` 2. **For SQLite**: SQLite encryption requires SQLCipher. If unavailable, consider migrating to TinyDB with encryption: ```bash # Export from SQLite export MCP_PA_DB_TYPE=sqlite python export_data.py # Import to encrypted TinyDB export MCP_PA_DB_TYPE=tinydb export MCP_PA_ENCRYPTION_KEY="your-secure-key" python import_data.py ``` ### Version Migrations When upgrading between versions, always: 1. **Backup your data**: ```bash # For SQLite cp database.sqlite database.sqlite.backup # For TinyDB cp database.json database.json.backup # For documents tar -czf documents.tar.gz documents/ ``` 2. **Check for migration scripts**: ```bash # Look for version-specific migrations ls migrations/ ``` 3. **Run migrations in order**: ```bash python migrations/v1_to_v2.py python migrations/v2_to_v3.py ``` ### Document Storage Migration To migrate documents to a new location: 1. **Move existing documents**: ```bash # Create new directory mkdir -p /new/document/path # Copy documents cp -r /old/document/path/* /new/document/path/ # Update configuration export MCP_PA_DOCS_DIR=/new/document/path ``` 2. **Update document references**: ```python # update_doc_paths.py from src.database_factory import get_database db = get_database() for doc in db.list_documents(): # Update file paths old_path = doc.file_path new_path = old_path.replace("/old/path", "/new/path") doc.file_path = new_path db.update_document(doc) ``` ### Troubleshooting Migration Issues #### Common Problems 1. **"Database version mismatch"** - Check if you're running the correct migration scripts - Verify database version in metadata 2. **"Encryption key error"** - Ensure you're using the same encryption key - Check if the database was previously encrypted 3. **"Document not found"** - Verify document paths are updated correctly - Check file permissions in new location #### Recovery Steps If migration fails: 1. **Restore from backup**: ```bash # Restore database cp database.backup database.sqlite # Restore documents tar -xzf documents.tar.gz ``` 2. **Check logs for errors**: ```bash # Enable debug logging export MCP_PA_LOG_LEVEL=DEBUG python -m src.server ``` 3. **Manual data recovery**: ```python # For corrupted SQLite import sqlite3 conn = sqlite3.connect('corrupted.db') conn.execute('PRAGMA integrity_check') # Export what can be salvaged cursor = conn.execute('SELECT * FROM projects') salvaged_data = cursor.fetchall() ``` ### Best Practices 1. **Always backup before migration** 2. **Test migrations on a copy first** 3. **Document custom modifications** 4. **Keep track of encryption keys** 5. **Verify data integrity after migration** ### Migration Scripts Create standardized migration scripts: ```python # migrations/base_migration.py class BaseMigration: def __init__(self, source_db, target_db): self.source = source_db self.target = target_db def migrate(self): self.backup() self.transform() self.validate() def backup(self): """Create backup before migration""" pass def transform(self): """Transform data between formats""" pass def validate(self): """Validate migrated data""" pass ``` ### Automated Migration Tool For complex migrations: ```python # migrate.py import argparse from src.database_factory import get_database def main(): parser = argparse.ArgumentParser() parser.add_argument('--from', dest='from_type', required=True) parser.add_argument('--to', dest='to_type', required=True) parser.add_argument('--source', required=True) parser.add_argument('--target', required=True) args = parser.parse_args() # Perform migration source_db = get_database(args.from_type, args.source) target_db = get_database(args.to_type, args.target) # Migrate data... if __name__ == "__main__": main() ``` ### Post-Migration Checklist - [ ] All data successfully migrated - [ ] No data loss or corruption - [ ] Document paths updated - [ ] Encryption working (if enabled) - [ ] Application functions normally - [ ] Backups are secure - [ ] Documentation updated

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/swapnilsurdi/mcp-pa'

If you have feedback or need assistance with the MCP directory API, please join our Discord server