verify_installation.py•5.43 kB
#!/usr/bin/env python3
"""
Verification script for Custom Obsidian MCP Server
This script checks:
1. Python dependencies are installed
2. Environment variables are set
3. Obsidian Local REST API is accessible
4. MCP server can be imported
Run: python verify_installation.py
"""
import sys
import os
def check_python_version():
"""Check Python version is 3.10+"""
print("Checking Python version...")
if sys.version_info < (3, 10):
print(f"❌ Python 3.10+ required. You have {sys.version_info.major}.{sys.version_info.minor}")
return False
print(f"✅ Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")
return True
def check_dependencies():
"""Check required packages are installed"""
print("\nChecking dependencies...")
required = ["mcp", "httpx", "pydantic", "frontmatter"]
missing = []
for package in required:
try:
__import__(package)
print(f"✅ {package}")
except ImportError:
print(f"❌ {package} (not installed)")
missing.append(package)
if missing:
print(f"\n❌ Missing packages: {', '.join(missing)}")
print("Run: pip install -e . or uv sync")
return False
return True
def check_environment():
"""Check environment variables"""
print("\nChecking environment variables...")
api_key = os.getenv("OBSIDIAN_API_KEY", "")
host = os.getenv("OBSIDIAN_HOST", "127.0.0.1")
port = os.getenv("OBSIDIAN_PORT", "27124")
if not api_key:
print("❌ OBSIDIAN_API_KEY not set")
print(" Get your API key from Obsidian → Settings → Community Plugins → Local REST API")
return False
else:
# Mask most of the key for security
masked = api_key[:8] + "..." + api_key[-4:] if len(api_key) > 12 else "***"
print(f"✅ OBSIDIAN_API_KEY: {masked}")
print(f"✅ OBSIDIAN_HOST: {host}")
print(f"✅ OBSIDIAN_PORT: {port}")
return True
def check_obsidian_connection():
"""Check connection to Obsidian Local REST API"""
print("\nChecking Obsidian connection...")
try:
import httpx
api_key = os.getenv("OBSIDIAN_API_KEY", "")
host = os.getenv("OBSIDIAN_HOST", "127.0.0.1")
port = os.getenv("OBSIDIAN_PORT", "27124")
if not api_key:
print("⚠️ Skipping (no API key set)")
return True # Don't fail if env not set
url = f"https://{host}:{port}/vault/"
headers = {"Authorization": f"Bearer {api_key}"}
# Make synchronous request for simplicity
client = httpx.Client(verify=False, timeout=5.0)
response = client.get(url, headers=headers)
client.close()
if response.status_code == 200:
print("✅ Connected to Obsidian Local REST API")
return True
else:
print(f"❌ HTTP {response.status_code}: {response.text}")
return False
except Exception as e:
print(f"❌ Connection failed: {str(e)}")
print("\nTroubleshooting:")
print("1. Is Obsidian running?")
print("2. Is the Local REST API plugin enabled?")
print("3. Is the port correct? (default: 27124)")
return False
def check_mcp_server():
"""Check MCP server can be imported"""
print("\nChecking MCP server import...")
try:
from custom_obsidian_mcp.server import mcp
print("✅ MCP server imports successfully")
print(f" Server name: {mcp.name}")
return True
except ImportError as e:
print(f"❌ Import failed: {str(e)}")
print(" Run: pip install -e . or uv sync")
return False
except Exception as e:
print(f"❌ Error: {str(e)}")
return False
def main():
"""Run all checks"""
print("=" * 60)
print("Custom Obsidian MCP Server - Installation Verification")
print("=" * 60)
checks = [
("Python Version", check_python_version),
("Dependencies", check_dependencies),
("Environment", check_environment),
("MCP Server", check_mcp_server),
("Obsidian Connection", check_obsidian_connection),
]
results = []
for name, check_func in checks:
try:
result = check_func()
results.append((name, result))
except Exception as e:
print(f"\n❌ Unexpected error in {name}: {str(e)}")
results.append((name, False))
# Summary
print("\n" + "=" * 60)
print("SUMMARY")
print("=" * 60)
passed = sum(1 for _, result in results if result)
total = len(results)
for name, result in results:
status = "✅" if result else "❌"
print(f"{status} {name}")
print(f"\nPassed: {passed}/{total}")
if passed == total:
print("\n🎉 All checks passed! Your MCP server is ready to use.")
print("\nNext steps:")
print("1. Add configuration to your LLM client (Claude Desktop, etc.)")
print("2. Restart your LLM client")
print("3. Start creating Zettelkasten notes!")
return 0
else:
print("\n⚠️ Some checks failed. Please fix the issues above.")
return 1
if __name__ == "__main__":
sys.exit(main())