Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| import subprocess | |
| import sys | |
| import json | |
| import threading | |
| import time | |
| # Ruta al server MCP | |
| SERVER_PATH = os.path.abspath(os.path.join("mcp_servers", "stdio_report_gen_server.py")) | |
| # Mantener el proceso del servidor MCP abierto durante toda la sesi贸n | |
| def start_mcp_server(): | |
| proc = subprocess.Popen( | |
| [sys.executable, SERVER_PATH], | |
| stdin=subprocess.PIPE, | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.PIPE, | |
| text=True, | |
| bufsize=1 | |
| ) | |
| print(f"[DEBUG] MCP STDIN: {proc.stdin}, STDOUT: {proc.stdout}, STDERR: {proc.stderr}") | |
| return proc | |
| mcp_proc = start_mcp_server() | |
| lock = threading.Lock() # Para evitar condiciones de carrera en stdio | |
| # Lee stderr de MCP en un hilo y guarda los logs | |
| stderr_logs = [] | |
| def read_stderr(proc): | |
| while True: | |
| line = proc.stderr.readline() | |
| if not line: | |
| break | |
| stderr_logs.append(line) | |
| print("[MCP STDERR]", line.strip()) | |
| stderr_thread = threading.Thread(target=read_stderr, args=(mcp_proc,), daemon=True) | |
| stderr_thread.start() | |
| # Comunicaci贸n usando JSON-RPC m铆nimo con timeout y logs | |
| def call_mcp_server(prompt): | |
| request = { | |
| "jsonrpc": "2.0", | |
| "id": 1, | |
| "method": "get_current_stock_price", # Cambiado para probar el m茅todo | |
| "params": [prompt] | |
| } | |
| try: | |
| with lock: | |
| print(f"[APP] Enviando petici贸n al MCP: {json.dumps(request)}") | |
| mcp_proc.stdin.write(json.dumps(request) + "\n") | |
| mcp_proc.stdin.flush() | |
| # Esperar respuesta con timeout | |
| start_time = time.time() | |
| response_line = '' | |
| while True: | |
| if mcp_proc.stdout.closed: | |
| return "El servidor MCP se cerr贸 inesperadamente." | |
| if mcp_proc.stdout.readable(): | |
| response_line = mcp_proc.stdout.readline() | |
| print(f"[APP] Recibido de MCP: {response_line}") | |
| if response_line.strip(): | |
| break | |
| if time.time() - start_time > 30: | |
| return f"Timeout esperando respuesta del servidor MCP. Logs recientes: {''.join(stderr_logs[-10:])}" | |
| time.sleep(0.1) | |
| if not response_line: | |
| return "No se recibi贸 respuesta del servidor MCP." | |
| response = json.loads(response_line) | |
| if "result" in response: | |
| return response["result"] | |
| elif "error" in response: | |
| return f"Error del servidor MCP: {response['error']}\nLogs recientes: {''.join(stderr_logs[-10:])}" | |
| else: | |
| return f"Respuesta inesperada del servidor MCP. Logs recientes: {''.join(stderr_logs[-10:])}" | |
| except Exception as e: | |
| return f"Error comunicando con el servidor MCP: {str(e)}\nLogs recientes: {''.join(stderr_logs[-10:])}" | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Generador de Reportes Financieros (Claude + MCP)") | |
| prompt = gr.Textbox(label="Informaci贸n financiera de la empresa") | |
| output = gr.Textbox(label="Reporte generado") | |
| btn = gr.Button("Generar reporte") | |
| btn.click(fn=call_mcp_server, inputs=prompt, outputs=output) | |
| if __name__ == "__main__": | |
| demo.launch() |