Skip to main content
Glama
test_falkordb_integration.py7.4 kB
#!/usr/bin/env python3 """ FalkorDB integration test for the Graphiti MCP Server. Tests MCP server functionality with FalkorDB as the graph database backend. """ import asyncio import json import time from typing import Any from mcp import StdioServerParameters from mcp.client.stdio import stdio_client class GraphitiFalkorDBIntegrationTest: """Integration test client for Graphiti MCP Server using FalkorDB backend.""" def __init__(self): self.test_group_id = f'falkor_test_group_{int(time.time())}' self.session = None async def __aenter__(self): """Start the MCP client session with FalkorDB configuration.""" # Configure server parameters to run with FalkorDB backend server_params = StdioServerParameters( command='uv', args=['run', 'main.py', '--transport', 'stdio', '--database-provider', 'falkordb'], env={ 'FALKORDB_URI': 'redis://localhost:6379', 'FALKORDB_PASSWORD': '', # No password for test instance 'FALKORDB_DATABASE': 'default_db', 'OPENAI_API_KEY': 'dummy_key_for_testing', 'GRAPHITI_GROUP_ID': self.test_group_id, }, ) # Start the stdio client self.session = await stdio_client(server_params).__aenter__() print(' 📡 Started MCP client session with FalkorDB backend') return self async def __aexit__(self, exc_type, exc_val, exc_tb): """Clean up the MCP client session.""" if self.session: await self.session.close() print(' 🔌 Closed MCP client session') async def call_mcp_tool(self, tool_name: str, arguments: dict[str, Any]) -> dict[str, Any]: """Call an MCP tool via the stdio client.""" try: result = await self.session.call_tool(tool_name, arguments) if hasattr(result, 'content') and result.content: # Handle different content types if hasattr(result.content[0], 'text'): content = result.content[0].text try: return json.loads(content) except json.JSONDecodeError: return {'raw_response': content} else: return {'content': str(result.content[0])} return {'result': 'success', 'content': None} except Exception as e: return {'error': str(e), 'tool': tool_name, 'arguments': arguments} async def test_server_status(self) -> bool: """Test the get_status tool to verify FalkorDB connectivity.""" print(' 🏥 Testing server status with FalkorDB...') result = await self.call_mcp_tool('get_status', {}) if 'error' in result: print(f' ❌ Status check failed: {result["error"]}') return False # Check if status indicates FalkorDB is working status_text = result.get('raw_response', result.get('content', '')) if 'running' in str(status_text).lower() or 'ready' in str(status_text).lower(): print(' ✅ Server status OK with FalkorDB') return True else: print(f' ⚠️ Status unclear: {status_text}') return True # Don't fail on unclear status async def test_add_episode(self) -> bool: """Test adding an episode to FalkorDB.""" print(' 📝 Testing episode addition to FalkorDB...') episode_data = { 'name': 'FalkorDB Test Episode', 'episode_body': 'This is a test episode to verify FalkorDB integration works correctly.', 'source': 'text', 'source_description': 'Integration test for FalkorDB backend', } result = await self.call_mcp_tool('add_episode', episode_data) if 'error' in result: print(f' ❌ Add episode failed: {result["error"]}') return False print(' ✅ Episode added successfully to FalkorDB') return True async def test_search_functionality(self) -> bool: """Test search functionality with FalkorDB.""" print(' 🔍 Testing search functionality with FalkorDB...') # Give some time for episode processing await asyncio.sleep(2) # Test node search search_result = await self.call_mcp_tool( 'search_nodes', {'query': 'FalkorDB test episode', 'limit': 5} ) if 'error' in search_result: print(f' ⚠️ Search returned error (may be expected): {search_result["error"]}') return True # Don't fail on search errors in integration test print(' ✅ Search functionality working with FalkorDB') return True async def test_clear_graph(self) -> bool: """Test clearing the graph in FalkorDB.""" print(' 🧹 Testing graph clearing in FalkorDB...') result = await self.call_mcp_tool('clear_graph', {}) if 'error' in result: print(f' ❌ Clear graph failed: {result["error"]}') return False print(' ✅ Graph cleared successfully in FalkorDB') return True async def run_falkordb_integration_test() -> bool: """Run the complete FalkorDB integration test suite.""" print('🧪 Starting FalkorDB Integration Test Suite') print('=' * 55) test_results = [] try: async with GraphitiFalkorDBIntegrationTest() as test_client: print(f' 🎯 Using test group: {test_client.test_group_id}') # Run test suite tests = [ ('Server Status', test_client.test_server_status), ('Add Episode', test_client.test_add_episode), ('Search Functionality', test_client.test_search_functionality), ('Clear Graph', test_client.test_clear_graph), ] for test_name, test_func in tests: print(f'\n🔬 Running {test_name} Test...') try: result = await test_func() test_results.append((test_name, result)) if result: print(f' ✅ {test_name}: PASSED') else: print(f' ❌ {test_name}: FAILED') except Exception as e: print(f' 💥 {test_name}: ERROR - {e}') test_results.append((test_name, False)) except Exception as e: print(f'💥 Test setup failed: {e}') return False # Summary print('\n' + '=' * 55) print('📊 FalkorDB Integration Test Results:') print('-' * 30) passed = sum(1 for _, result in test_results if result) total = len(test_results) for test_name, result in test_results: status = '✅ PASS' if result else '❌ FAIL' print(f' {test_name}: {status}') print(f'\n🎯 Overall: {passed}/{total} tests passed') if passed == total: print('🎉 All FalkorDB integration tests PASSED!') return True else: print('⚠️ Some FalkorDB integration tests failed') return passed >= (total * 0.7) # Pass if 70% of tests pass if __name__ == '__main__': success = asyncio.run(run_falkordb_integration_test()) exit(0 if success else 1)

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/getzep/graphiti'

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