setup.py•6.63 kB
#!/usr/bin/env python3
"""
Project Synapse MCP Server Setup Script
This script helps users set up Project Synapse with all required dependencies
and initial configuration.
"""
import os
import shutil
import subprocess
import sys
from pathlib import Path
def run_command(cmd, check=True, capture_output=False):
    """Run a command and handle errors."""
    print(f"Running: {' '.join(cmd)}")
    result = subprocess.run(cmd, check=check, capture_output=capture_output, text=True)
    return result
def check_python_version():
    """Check if Python version is compatible."""
    print("Checking Python version...")
    if sys.version_info < (3, 12):
        print("❌ Python 3.12+ is required. Current version:", sys.version)
        return False
    print(f"✅ Python {sys.version_info.major}.{sys.version_info.minor} is compatible")
    return True
def check_uv_installation():
    """Check if uv is installed."""
    print("Checking uv installation...")
    if not shutil.which('uv'):
        print("❌ uv is not installed. Please install it from: https://docs.astral.sh/uv/")
        return False
    print("✅ uv is installed")
    return True
def setup_virtual_environment():
    """Set up virtual environment with uv."""
    print("Setting up virtual environment...")
    try:
        # Create virtual environment
        run_command(['uv', 'venv', '--python', '3.12', '--seed'])
        # Install project dependencies (editable mode)
        run_command(['uv', 'pip', 'install', '-e', '.'])
        print("✅ Virtual environment created and dependencies installed")
        return True
    except subprocess.CalledProcessError as e:
        print(f"❌ Failed to set up virtual environment: {e}")
        return False
def download_spacy_model():
    """Download required spaCy model."""
    print("Downloading spaCy model...")
    try:
        run_command(['uv', 'run', 'python', '-m', 'spacy', 'download', 'en_core_web_sm'])
        print("✅ spaCy model downloaded")
        return True
    except subprocess.CalledProcessError as e:
        print(f"❌ Failed to download spaCy model: {e}")
        return False
def setup_environment_file():
    """Set up environment configuration file."""
    print("Setting up environment configuration...")
    env_example = Path('.env.example')
    env_file = Path('.env')
    if env_example.exists() and not env_file.exists():
        shutil.copy(env_example, env_file)
        print("✅ Created .env file from template")
        print("⚠️  Please edit .env file with your specific configuration")
        return True
    elif env_file.exists():
        print("✅ .env file already exists")
        return True
    else:
        print("❌ .env.example file not found")
        return False
def check_neo4j():
    """Check if Neo4j is available."""
    print("Checking Neo4j availability...")
    # Try to connect to default Neo4j instance
    try:
        import neo4j
        from dotenv import load_dotenv
        load_dotenv()
        neo4j_uri = os.getenv("NEO4J_URI", "bolt://localhost:7687")
        neo4j_user = os.getenv("NEO4J_USER", "neo4j")
        neo4j_password = os.getenv("NEO4J_PASSWORD", "synapse_password")
        driver = neo4j.GraphDatabase.driver(
            neo4j_uri,
            auth=(neo4j_user, neo4j_password)
        )
        with driver.session() as session:
            session.run("RETURN 1")
        driver.close()
        print("✅ Neo4j is running and accessible")
        return True
    except Exception as e:
        print(f"⚠️  Neo4j connection failed: {e}")
        print("Please ensure Neo4j is installed and running with the correct credentials from your .env file")
        return False
def run_basic_tests():
    """Run basic tests to verify installation."""
    print("Running basic tests...")
    try:
        result = run_command(['uv', 'run', 'python', '-m', 'pytest', 'tests/test_basic.py', '-v'],
                           capture_output=True)
        if result.returncode == 0:
            print("✅ Basic tests passed")
            return True
        else:
            print(f"⚠️  Some tests failed:\n{result.stderr}")
            return False
    except subprocess.CalledProcessError as e:
        print(f"❌ Failed to run tests: {e}")
        return False
def create_example_config():
    """Create example MCP configuration for Claude Desktop."""
    print("Creating example MCP configuration...")
    config_content = {
        "mcpServers": {
            "project-synapse": {
                "command": "uv",
                "args": [
                    "--directory",
                    str(Path.cwd().absolute()),
                    "run",
                    "python",
                    "-m",
                    "synapse_mcp.server"
                ],
                "env": {
                    "NEO4J_URI": "bolt://localhost:7687",
                    "NEO4J_USER": "neo4j",
                    "NEO4J_PASSWORD": "synapse_password",
                    "NEO4J_DATABASE": "synapse",
                    "LOG_LEVEL": "INFO"
                }
            }
        }
    }
    # Write to current directory
    import json
    with open('claude_desktop_config.json', 'w') as f:
        json.dump(config_content, f, indent=2)
    print("✅ Created claude_desktop_config.json")
    print("Copy this configuration to your Claude Desktop config file")
    return True
def main():
    """Main setup function."""
    print("🧠 Project Synapse MCP Server Setup")
    print("=" * 40)
    # Check prerequisites
    if not check_python_version():
        sys.exit(1)
    if not check_uv_installation():
        sys.exit(1)
    # Setup steps
    success = True
    success &= setup_virtual_environment()
    success &= download_spacy_model()
    success &= setup_environment_file()
    # Optional checks
    check_neo4j()  # Don't fail on Neo4j issues
    run_basic_tests()  # Don't fail on test issues
    # Create configuration
    create_example_config()
    print("\n" + "=" * 40)
    if success:
        print("🎉 Setup completed successfully!")
        print("\nNext steps:")
        print("1. Edit .env file with your configuration")
        print("2. Start Neo4j database")
        print("3. Add claude_desktop_config.json to Claude Desktop")
        print("4. Test the server: uv run python -m synapse_mcp.server")
    else:
        print("⚠️  Setup completed with some issues")
        print("Please review the errors above and fix them manually")
    print("\nFor more information, see README.md")
if __name__ == "__main__":
    main()