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() |