agent-mcp-sql / ops /scripts /validate.py
Timothy Eastridge
commit step 10
ead5455
#!/usr/bin/env python3
"""Validate that the MVP system is working correctly"""
import requests
import time
import json
import sys
MCP_URL = "http://localhost:8000/mcp"
API_KEY = "dev-key-123"
def call_mcp(tool, params=None):
response = requests.post(
MCP_URL,
headers={"X-API-Key": API_KEY, "Content-Type": "application/json"},
json={"tool": tool, "params": params or {}}
)
return response.json()
def validate_step(step_name, validation_func):
"""Run a validation step and report results"""
print(f"Validating: {step_name}...", end=" ")
try:
result = validation_func()
if result:
print("✅ PASSED")
return True
else:
print("❌ FAILED")
return False
except Exception as e:
print(f"❌ ERROR: {e}")
return False
def check_neo4j():
"""Check Neo4j is accessible via MCP"""
result = call_mcp("get_schema")
return "labels" in result
def check_postgres():
"""Check PostgreSQL has sample data"""
result = call_mcp("query_postgres", {"query": "SELECT COUNT(*) as count FROM customers"})
return result.get("data", [{}])[0].get("count", 0) > 0
def check_schema_discovery():
"""Check schema can be discovered"""
result = call_mcp("discover_postgres_schema")
schema = result.get("schema", {})
return "customers" in schema and "orders" in schema
def create_test_workflow():
"""Create a test workflow"""
# Create workflow
workflow = call_mcp("write_graph", {
"action": "create_node",
"label": "Workflow",
"properties": {
"id": "validation-workflow",
"name": "Validation Test",
"status": "active"
}
})
# Create test instruction
instruction = call_mcp("write_graph", {
"action": "create_node",
"label": "Instruction",
"properties": {
"id": "validation-inst-1",
"type": "generate_sql",
"sequence": 1,
"status": "pending",
"pause_duration": 5, # Short pause for testing
"parameters": json.dumps({"question": "Count all customers"})
}
})
# Link instruction to workflow
call_mcp("query_graph", {
"query": """
MATCH (w:Workflow {id: 'validation-workflow'}),
(i:Instruction {id: 'validation-inst-1'})
CREATE (w)-[:HAS_INSTRUCTION]->(i)
"""
})
return workflow.get("created") is not None
def check_instruction_execution():
"""Check if instruction gets executed"""
# Wait for agent to pick it up (max 60 seconds)
for _ in range(12):
result = call_mcp("query_graph", {
"query": """
MATCH (i:Instruction {id: 'validation-inst-1'})
RETURN i.status as status
"""
})
status = result["data"][0]["status"] if result.get("data") else "unknown"
if status in ["executing", "complete"]:
return True
time.sleep(5)
return False
def check_execution_logged():
"""Check if execution was logged"""
result = call_mcp("query_graph", {
"query": """
MATCH (i:Instruction {id: 'validation-inst-1'})-[:EXECUTED_AS]->(e:Execution)
RETURN e
"""
})
return len(result.get("data", [])) > 0
def check_frontend():
"""Check if frontend is accessible"""
try:
response = requests.get("http://localhost:3000")
return response.status_code == 200
except:
return False
def main():
print("=" * 50)
print("MVP SYSTEM VALIDATION")
print("=" * 50)
print()
# Track results
all_passed = True
# Core services
all_passed &= validate_step("Neo4j accessible via MCP", check_neo4j)
all_passed &= validate_step("PostgreSQL has sample data", check_postgres)
all_passed &= validate_step("Frontend is accessible", check_frontend)
# Functionality
all_passed &= validate_step("Schema discovery works", check_schema_discovery)
all_passed &= validate_step("Workflow creation works", create_test_workflow)
print()
print("Waiting for agent to process instruction...")
all_passed &= validate_step("Instruction gets executed", check_instruction_execution)
all_passed &= validate_step("Execution is logged", check_execution_logged)
# Final verification
print()
print("=" * 50)
if all_passed:
print("✅ ALL VALIDATIONS PASSED!")
print("The MVP system is working correctly.")
# Show sample query result
result = call_mcp("query_graph", {
"query": """
MATCH (n)
RETURN labels(n)[0] as label, count(n) as count
ORDER BY count DESC
"""
})
print()
print("Graph Statistics:")
for item in result.get("data", []):
print(f" - {item['label']}: {item['count']} nodes")
else:
print("❌ SOME VALIDATIONS FAILED")
print("Please check the logs and fix issues.")
sys.exit(1)
print("=" * 50)
if __name__ == "__main__":
main()