contract-guardian / agent /mcp_tools.py
sbcesar
Proyect Finished :D
80e1d6c
#!/usr/bin/env python3
"""
agent/mcp_tools.py
Gestor de herramientas MCP.
Se encarga de hacer las llamadas HTTP a los servidores MCP (puertos 8001 y 8002).
"""
import requests
import logging
from typing import Dict, List, Any
logger = logging.getLogger(__name__)
# ============================================================
# CONFIGURACIÓN MCP SERVERS
# ============================================================
# URLs de tus servidores MCP locales
MCP_LAW_RETRIEVER_URL = "http://localhost:8001/law_lookup"
MCP_CLASSIFIER_URL = "http://localhost:8002/classify_clauses"
# Tiempo máximo de espera por respuesta (segundos)
MCP_TIMEOUT = 10
# ============================================================
# GESTOR MCP TOOLS
# ============================================================
class MCPToolsManager:
"""Gestor de herramientas MCP."""
def __init__(self):
# Verificación básica de conexión (opcional)
pass
def classify_clauses(self, contract_text: str) -> Dict[str, Any]:
"""
Llama a la herramienta 'classify_clauses' del servidor MCP (8002).
Args:
contract_text: Texto completo del contrato.
Returns:
Dict con la clasificación de cláusulas y riesgos.
"""
try:
logger.info("📞 MCP CALL: classify_clauses (Sending contract text...)")
response = requests.post(
MCP_CLASSIFIER_URL,
json={"contract_text": contract_text},
timeout=MCP_TIMEOUT
)
if response.status_code == 200:
result = response.json()
# A veces la respuesta viene anidada, intentamos normalizar
clauses = result.get('clauses', [])
logger.info(f"✅ MCP RESPONSE: Classified {len(clauses)} clauses")
return result
else:
logger.error(f"❌ MCP ERROR (8002): Status {response.status_code} - {response.text}")
return {"error": f"Status {response.status_code}", "clauses": []}
except Exception as e:
logger.error(f"❌ MCP CONNECTION ERROR (8002): {e}")
return {"error": str(e), "clauses": []}
def law_lookup(self, topic: str) -> Dict[str, Any]:
"""
Llama a la herramienta 'law_lookup' del servidor MCP (8001).
Args:
topic: Término de búsqueda (ej: "fianza", "despido").
Returns:
Dict con los artículos legales encontrados.
"""
try:
# Limpieza básica del término
topic = topic.strip().lower()
if not topic:
return {}
logger.info(f"📞 MCP CALL: law_lookup ('{topic}')")
response = requests.post(
MCP_LAW_RETRIEVER_URL,
json={"topic": topic},
timeout=MCP_TIMEOUT
)
if response.status_code == 200:
result = response.json()
count = result.get('total_results', 0)
logger.info(f"✅ MCP RESPONSE: Found {count} laws for '{topic}'")
return result
else:
logger.error(f"❌ MCP ERROR (8001): Status {response.status_code} - {response.text}")
return {"error": f"Status {response.status_code}", "results": []}
except Exception as e:
logger.error(f"❌ MCP CONNECTION ERROR (8001): {e}")
return {"error": str(e), "results": []}
if __name__ == "__main__":
# Test rápido si se ejecuta directamente
manager = MCPToolsManager()
print("🔍 Probando conexión con law_retriever...")
res = manager.law_lookup("prueba")
print(f"Resultado: {res}")