File size: 3,244 Bytes
d3a578b
c00adea
d3a578b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
881d8d0
d3a578b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c00adea
d3a578b
 
 
 
 
 
56bc197
881d8d0
d3a578b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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()