Major Changes: - Implemented MCP HTTP/SSE transport server for n8n and web clients - Created mcp_server/http_server.py with FastAPI for JSON-RPC 2.0 over HTTP - Added health check endpoint (/health) for container monitoring - Refactored mcp-server/ to mcp_server/ (Python module structure) - Updated Dockerfile.mcp to run HTTP server with health checks MCP Server Features: - 7 memory tools exposed via MCP (add, search, get, update, delete) - HTTP/SSE transport on port 8765 for n8n integration - stdio transport for Claude Code integration - JSON-RPC 2.0 protocol implementation - CORS support for web clients n8n Integration: - Successfully tested with AI Agent workflows - MCP Client Tool configuration documented - Working webhook endpoint tested and verified - System prompt optimized for automatic user_id usage Documentation: - Created comprehensive Mintlify documentation site - Added docs/mcp/introduction.mdx - MCP server overview - Added docs/mcp/installation.mdx - Installation guide - Added docs/mcp/tools.mdx - Complete tool reference - Added docs/examples/n8n.mdx - n8n integration guide - Added docs/examples/claude-code.mdx - Claude Code setup - Updated README.md with MCP HTTP server info - Updated roadmap to mark Phase 1 as complete Bug Fixes: - Fixed synchronized delete operations across Supabase and Neo4j - Updated memory_service.py with proper error handling - Fixed Neo4j connection issues in delete operations Configuration: - Added MCP_HOST and MCP_PORT environment variables - Updated .env.example with MCP server configuration - Updated docker-compose.yml with MCP container health checks Testing: - Added test scripts for MCP HTTP endpoint verification - Created test workflows in n8n - Verified all 7 memory tools working correctly - Tested synchronized operations across both stores Version: 1.0.0 Status: Phase 1 Complete - Production Ready 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
125 lines
3.5 KiB
Python
125 lines
3.5 KiB
Python
"""
|
|
Shared configuration for T6 Mem0 v2
|
|
Loads environment variables and creates Mem0 configuration
|
|
"""
|
|
|
|
import os
|
|
from typing import Dict, Any
|
|
from pydantic_settings import BaseSettings
|
|
from pydantic import Field
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
"""Application settings loaded from environment variables"""
|
|
|
|
# OpenAI
|
|
openai_api_key: str = Field(..., env="OPENAI_API_KEY")
|
|
|
|
# Supabase
|
|
supabase_connection_string: str = Field(..., env="SUPABASE_CONNECTION_STRING")
|
|
|
|
# Neo4j
|
|
neo4j_uri: str = Field(..., env="NEO4J_URI")
|
|
neo4j_user: str = Field(default="neo4j", env="NEO4J_USER")
|
|
neo4j_password: str = Field(..., env="NEO4J_PASSWORD")
|
|
|
|
# API
|
|
api_host: str = Field(default="0.0.0.0", env="API_HOST")
|
|
api_port: int = Field(default=8080, env="API_PORT")
|
|
api_key: str = Field(..., env="API_KEY")
|
|
|
|
# MCP Server
|
|
mcp_host: str = Field(default="0.0.0.0", env="MCP_HOST")
|
|
mcp_port: int = Field(default=8765, env="MCP_PORT")
|
|
|
|
# Mem0
|
|
mem0_collection_name: str = Field(default="t6_memories", env="MEM0_COLLECTION_NAME")
|
|
mem0_embedding_dims: int = Field(default=1536, env="MEM0_EMBEDDING_DIMS")
|
|
mem0_version: str = Field(default="v1.1", env="MEM0_VERSION")
|
|
|
|
# Logging
|
|
log_level: str = Field(default="INFO", env="LOG_LEVEL")
|
|
log_format: str = Field(default="json", env="LOG_FORMAT")
|
|
|
|
# Environment
|
|
environment: str = Field(default="development", env="ENVIRONMENT")
|
|
|
|
# Docker (optional, for container deployments)
|
|
docker_network: str = Field(default="bridge", env="DOCKER_NETWORK")
|
|
|
|
class Config:
|
|
env_file = ".env"
|
|
env_file_encoding = "utf-8"
|
|
case_sensitive = False
|
|
|
|
|
|
def get_settings() -> Settings:
|
|
"""Get application settings"""
|
|
return Settings()
|
|
|
|
|
|
def get_mem0_config(settings: Settings) -> Dict[str, Any]:
|
|
"""
|
|
Generate Mem0 configuration from settings
|
|
|
|
Args:
|
|
settings: Application settings
|
|
|
|
Returns:
|
|
Dict containing Mem0 configuration
|
|
"""
|
|
return {
|
|
# Vector Store - Supabase
|
|
"vector_store": {
|
|
"provider": "supabase",
|
|
"config": {
|
|
"connection_string": settings.supabase_connection_string,
|
|
"collection_name": settings.mem0_collection_name,
|
|
"embedding_model_dims": settings.mem0_embedding_dims,
|
|
"index_method": "hnsw", # Fastest search
|
|
"index_measure": "cosine_distance" # Best for embeddings
|
|
}
|
|
},
|
|
|
|
# Graph Store - Neo4j
|
|
"graph_store": {
|
|
"provider": "neo4j",
|
|
"config": {
|
|
"url": settings.neo4j_uri,
|
|
"username": settings.neo4j_user,
|
|
"password": settings.neo4j_password
|
|
}
|
|
},
|
|
|
|
# LLM Provider - OpenAI
|
|
"llm": {
|
|
"provider": "openai",
|
|
"config": {
|
|
"model": "gpt-4o-mini",
|
|
"temperature": 0.1,
|
|
"max_tokens": 2000,
|
|
"api_key": settings.openai_api_key
|
|
}
|
|
},
|
|
|
|
# Embedder - OpenAI
|
|
"embedder": {
|
|
"provider": "openai",
|
|
"config": {
|
|
"model": "text-embedding-3-small",
|
|
"embedding_dims": settings.mem0_embedding_dims,
|
|
"api_key": settings.openai_api_key
|
|
}
|
|
},
|
|
|
|
# Version
|
|
"version": settings.mem0_version
|
|
}
|
|
|
|
|
|
# Global settings instance
|
|
settings = get_settings()
|
|
|
|
# Global mem0 config
|
|
mem0_config = get_mem0_config(settings)
|