聊天机器人主机

一个Python聊天机器人,用于集成MCP服务,支持多轮对话上下文记忆和日志记录。

  • by DiederichSolis
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 DiederichSolis/chatbot-mcp

使用说明

Chatbot MCP – Host en consola (Parte 1)

Chatbot en Python que funciona como anfitrión para integrar MCP. Estado actual (Parte 1):

  • ✅ Conexión a un LLM vía API (Anthropic por defecto) para preguntas generales.
  • ✅ Memoria de contexto multi-turno con comando /reset.
  • ✅ Logging en formato JSONL de interacciones MCP (incluye un /log-demo para generar eventos REQ/RES de ejemplo y /show-log para visualizarlos).

Repo del servidor MCP propio (público, separado):
dataframe-analyst-mcp → https://github.com/DiederichSolis/dataframe-analyst-mcp.git
Este chatbot está diseñado para conectarse a servidores MCP


Requisitos

  • Python 3.10+
  • Cuenta y API key del proveedor LLM (Anthropic recomendado).

Instalación

git clone <ESTE_REPO_CHATBOT>.git
cd chatbot-mcp
python -m venv .venv
# macOS/Linux
source .venv/bin/activate
# Windows PowerShell
# .\.venv\Scripts\Activate.ps1

pip install -r requirements.txt

Configuración (.env)

Copia .env.example a .env y ajusta:

LLM_PROVIDER=anthropic                     # anthropic | openai | echo
LLM_MODEL=claude-3-7-sonnet-latest        # modelo recomendado vigente
ANTHROPIC_API_KEY=sk-ant-XXXXXXXXXXXX     # tu key de Anthropic

# (Opcional para OpenAI)
# OPENAI_API_KEY=sk-openai-XXXXXXXXXXXX
# LLM_MODEL=gpt-4o-mini

# Ajustes opcionales
# REQUEST_TIMEOUT_S=60

Uso rápido

python app.py

Ejemplo de sesión:

Chatbot MCP (Parte 1) — escribe tu mensaje. Comandos: /reset, /show-log [N], /exit
> ¿Qué es la fotosíntesis?
<respuesta del LLM>
> /reset
(contexto reiniciado)
> /exit
Adiós!

Comandos del chatbot

Comando Descripción Ejemplo
/reset Borra el contexto de la conversación (memoria). /reset
/show-log [N] Muestra los últimos N eventos MCP formateados (REQ/RES, server, método, id). Por defecto N=20. /show-log 10
/show-log-json [N] Muestra los últimos N eventos en JSONL (útil para inspección de payloads). /show-log-json 5
/log-demo Genera 1 request y 1 response de ejemplo en el log (filesystem::tools/list). /log-demo
/show-log-raw [N] Muestra las últimas N líneas crudas del archivo logs/mcp.log.jsonl. /show-log-raw 5
/help o /ayuda Muestra esta ayuda de comandos. /help
/exit Sale del programa. /exit

Nota: si escribes algo que empieza con / y no existe como comando, el bot te mostrará /help (no lo enviará al LLM).


Logs MCP

  • Archivo: logs/mcp.log.jsonl (un evento por línea JSON).
  • Esquema (campos principales):
    • ts (epoch), direction (request|response), server, method, id, params, result, error.

Ver desde el propio bot:

> /log-demo
(se registraron 2 eventos MCP de ejemplo)
> /show-log 2
[2025-.. ..:..:..] REQ filesystem::tools/list id=demo-1
[2025-.. ..:..:..] RES filesystem::tools/list id=demo-1
> /show-log-json 2
{"ts":"...", "direction":"request", "server":"filesystem", "method":"tools/list", "id":"demo-1", "params":{"path":"."}}
{"ts":"...", "direction":"response","server":"filesystem","method":"tools/list","id":"demo-1","result":{"entries":["README.md"]}}

Ver desde la terminal (fuera del bot):

tail -n 2 logs/mcp.log.jsonl

Pruebas rápidas (scriptables)

Conexión LLM (5%)

python app.py << 'EOF'
¿Qué es la fotosíntesis?
/exit
EOF

Contexto / anáfora (5%)

python app.py << 'EOF'
¿Quién fue Alan Turing?
¿En qué fecha nació?
¿Y en qué campo hizo sus aportes más influyentes?
/exit
EOF

Reset de contexto

python app.py << 'EOF'
¿Quién fue Alan Turing?
/reset
¿En qué fecha nació?
/exit
EOF

Log MCP visible (5%)

python app.py << 'EOF'
/log-demo
/show-log 2
/show-log-json 2
/exit
EOF

Estructura del proyecto

chatbot-mcp/
├─ app.py
├─ requirements.txt
├─ .env.example
├─ README.md
├─ logs/
│  └─ .gitkeep
└─ chatbot/
   ├─ __init__.py
   ├─ config.py        # carga .env y opciones del LLM
   ├─ memory.py        # buffer de contexto con poda y reset
   ├─ llm_client.py    # cliente LLM (anthropic|openai|echo)
   ├─ mcp_logging.py   # logger JSONL + pretty/tail
   └─ commands.py      # /reset, /show-log, /show-log-json, /log-demo, /show-log-raw, /help, /exit

Integración con servidor MCP

Repo público (separado): https://github.com/DiederichSolis/dataframe-analyst-mcp.git

  1. Clona o instala tu servidor MCP:
    • Submódulo
      git submodule add https://github.com/DiederichSolis/dataframe-analyst-mcp.git external/dataframe-analyst-mcp
      
    • o pip desde Git (si está paquetizado):
      pip install "git+https://github.com/DiederichSolis/dataframe-analyst-mcp.git#egg=dataframe_analyst_mcp"
      
  2. Invoca las operaciones MCP desde el host (por stdio/cliente) y regístralas en el logger:
    from uuid import uuid4
    rid = f"df-{uuid4().hex[:6]}"
    mcp_logger.log_request("dataframe-analyst-mcp", "tools/tu_metodo", {"param":"valor"}, id=rid)
    # result = client.tu_llamada_real(...)
    mcp_logger.log_response("dataframe-analyst-mcp", "tools/tu_metodo", result={"ok": True}, id=rid)
    
  3. Demuestra el tráfico real con /show-log y captura PCAP con Wireshark para tu reporte.

Solución de problemas

  • [ERROR LLM] Error Anthropic: 401 → revisa ANTHROPIC_API_KEY en .env.
  • Error 404 model not found → usa un modelo vigente (p. ej. claude-3-7-sonnet-latest).
  • No toma la .env → activa el venv y ejecuta desde la carpeta del proyecto.
  • Tiempo de espera → aumenta REQUEST_TIMEOUT_S a 90.
  • /log-demo responde texto del LLM → revisa que el comando exista en commands.py (no debe pasar al LLM).