Ollama Deep Researcher

Realiza investigaciones profundas utilizando LLMs locales de Ollama, aprovechando Tavily y Perplexity para capacidades de búsqueda exhaustivas.

Documentación

⛔ ARCHIVADO — este código se ha movido

Migrado al monorepo de la plataforma mcpcentral el 2026-07-23 (ADR-043). Trabaja aquí en su lugar: mcpcentral-io/mcpcentral → apps/deep-researcher/ Trabajador: mcpcentral-deep-researcher Este repositorio es de solo lectura y se conserva por motivos históricos. Consulta DEPRECATED.md.


Extensión DXT de Ollama Deep Researcher

Descripción general

Ollama Deep Researcher es una Extensión de Escritorio (DXT) que permite la investigación avanzada de temas mediante búsqueda web y síntesis con LLM, impulsada por un servidor MCP local. Admite parámetros de investigación configurables, seguimiento de estado y acceso a recursos, y está diseñada para una integración perfecta con el ecosistema DXT.

  • Investiga cualquier tema usando APIs de búsqueda web (Tavily, Perplexity, Exa) y LLMs (Ollama, DeepSeek, etc.)
  • Configura el número máximo de bucles de investigación, el modelo LLM y la API de búsqueda
  • Realiza un seguimiento del estado de la investigación en curso
  • Accede a los resultados de investigación como recursos mediante el protocolo MCP

Características

  • Implementa el protocolo MCP sobre stdio para una operación local y segura
  • Programación defensiva: manejo de errores, tiempos de espera y validación
  • Registro y depuración a través de stderr
  • Compatible con entornos host DXT

Estructura de directorios

.
├── manifest.json         # DXT manifest (see MANIFEST.md for spec)
├── src/
│   ├── index.ts         # MCP server entrypoint (Node.js, stdio transport)
│   └── assistant/       # Python research logic
│       └── run_research.py
├── README.md            # This documentation
└── ...

Instalación y configuración

  1. Clona el repositorio e instala las dependencias:

    git clone <your-repo-url>
    cd mcp-server-ollama-deep-researcher
    npm install
    
  2. Instala las dependencias de Python para el asistente:

    cd src/assistant
    pip install -r requirements.txt
    # or use pyproject.toml/uv if preferred
    
  3. Configura las variables de entorno necesarias para las APIs de búsqueda web:

    • Para Tavily: TAVILY_API_KEY
    • Para Perplexity: PERPLEXITY_API_KEY
    • Para Exa: EXA_API_KEY (Obtén la tuya en https://dashboard.exa.ai/api-keys)
    • Opcional: LANGSMITH_API_KEY, LANGSMITH_TRACING=true, OLLAMA_BASE_URL (por defecto: http://localhost:11434)
    • Ejemplo:
      export TAVILY_API_KEY=your_tavily_key
      export PERPLEXITY_API_KEY=your_perplexity_key
      export EXA_API_KEY=your_exa_key
      
    • ¿Prefieres no guardar claves en texto plano en el disco? Consulta Opcional: secretos seguros con 1Password a continuación.
  4. Compila el servidor TypeScript (si es necesario):

    npm run build
    
  5. Ejecuta la extensión localmente para probarla:

    node dist/index.js
    # Or use the DXT host to load the extension per DXT documentation
    

Uso

  • Investiga un tema:
    • Usa la herramienta research con { "topic": "Your subject" }
  • Obtén el estado de la investigación:
    • Usa la herramienta get_status
  • Configura los parámetros de investigación:
    • Usa la herramienta configure con cualquiera de: maxLoops, llmModel, searchApi

Manifiesto

Consulta manifest.json para ver el manifiesto DXT completo, incluidos los esquemas de herramientas y las plantillas de recursos. Sigue DXT MANIFEST.md.

Registro y depuración

  • Todos los registros y errores del servidor se envían a stderr para depuración.
  • Los subprocesos de investigación se terminan después de 30 minutos para evitar bloqueos.
  • Las solicitudes no válidas y los errores de configuración devuelven mensajes de error claros y estructurados.

Seguridad y mejores prácticas

  • Todos los esquemas de herramientas se validan antes de la ejecución.
  • Las claves API son necesarias para las APIs de búsqueda web y nunca se registran.
  • El protocolo MCP se utiliza sobre stdio para una comunicación local y segura.

Pruebas y validación

  • Valida la extensión cargándola en un host compatible con DXT.
  • Asegúrate de que todas las llamadas a herramientas devuelvan respuestas JSON válidas y estructuradas.
  • Comprueba que el manifiesto se carga y que la extensión se registra como DXT.

Solución de problemas

  • Falta la clave API: Asegúrate de que TAVILY_API_KEY, PERPLEXITY_API_KEY o EXA_API_KEY esté configurada en tu entorno según la API de búsqueda que estés utilizando.
  • Errores de Python: Revisa las dependencias de Python y los registros en stderr.
  • Tiempos de espera: Los subprocesos de investigación están limitados a 30 minutos.

Comparación de APIs de búsqueda

  • Tavily: Búsqueda web rápida y completa con extracción de contenido sin procesar
  • Perplexity: Búsqueda impulsada por IA con resúmenes en lenguaje natural y citas
  • Exa: Motor de búsqueda neuronal optimizado para búsqueda semántica con resaltados

Opcional: secretos seguros con 1Password

Si usas 1Password, puedes mantener las claves API en texto plano fuera de tu disco y fuera del contexto de tu agente de codificación de IA. Esto es optativo y aditivo — la configuración en texto plano anterior sigue funcionando sin cambios. Requisitos: 1Password para Mac o Linux, el CLI op (brew install --cask 1password-cli) y sqlite3.

Crea un Entorno de 1Password que contenga estas ocho variables (las cuatro claves son secretas; el resto son configuración no secreta):

Variable¿Secreta?
TAVILY_API_KEY, PERPLEXITY_API_KEY, EXA_API_KEY, LANGSMITH_API_KEYsí
OLLAMA_BASE_URL, LANGSMITH_TRACING, LANGSMITH_ENDPOINT, LANGSMITH_PROJECTno

Puedes importar un .env existente directamente al crear el Entorno. Una vez que exista, elige cualquiera de los tres mecanismos siguientes (A es el patrón de codificación con IA; B es el lanzamiento MCP recomendado por 1Password; C es un respaldo para hosts que no pueden ejecutar op).

A. .env montado + hook de validación (mantiene el texto plano fuera del contexto del LLM)

Los Entornos de 1Password montan un .env local como un pipe con nombre UNIX (FIFO): los contenidos se transmiten bajo demanda a lectores autorizados y nunca se almacenan en disco. Un hook de PreToolUse de Claude Code valida el montaje antes de que el agente ejecute comandos de shell.

  1. En la aplicación de escritorio de 1Password, abre tu Entorno → Destinos → Archivo .env local → Elegir ruta de archivo → .env → Montar. Verifica con cat .env (aprueba mediante Touch ID; la autenticación dura hasta que 1Password se bloquee).
  2. .1password/environments.toml (confirmado) le dice al hook qué rutas validar — ya configurado en mount_paths = [".env"].
  3. Instala el hook de validación localmente:
    git clone https://github.com/1Password/agent-hooks /tmp/agent-hooks
    /tmp/agent-hooks/install.sh --agent claude-code --target-dir .
    
    Esto crea .claude/claude-code-1password-hooks-bundle/ y .claude/settings.json (ambos ignorados por git). El hook es fail-open: si 1Password o sqlite3 no están disponibles, permite la ejecución, por lo que los contribuyentes que no usan 1Password no se ven afectados.
  4. Pruébalo: echo '{"command":"echo test","workspace_roots":["'"$PWD"'"]}' | .claude/claude-code-1password-hooks-bundle/bin/run-hook.sh 1password-validate-mounted-env-files → {"permission":"allow"} mientras está desbloqueado, deny con instrucciones de corrección cuando está bloqueado.

B. op run --environment para el lanzamiento del servidor MCP

Copia .mcp.json.1password.example → .mcp.json (ignorado por git), reemplaza <ENVIRONMENT_ID> con tu ID de Entorno, y tu host MCP resolverá los secretos al lanzar mediante op run. La configuración no secreta permanece en el bloque env; los secretos se inyectan desde el Entorno. La plantilla usa la ruta completa /opt/homebrew/bin/op porque los hosts lanzados por GUI (por ejemplo, Claude Desktop) no heredan tu $PATH de shell — ajusta si tu op se encuentra en otro lugar (which op).

Respaldo si tu CLI op carece de --environment (el subcomando environment es parte de la beta de Entornos de 1Password y está ausente en algunas compilaciones, por ejemplo, op v2.34.x): usa op run --env-file .env contra un .env simple de referencias op:// en su lugar. Crea el elemento una vez (op item create --vault "Your Vault" --category "Login" --title "ollama-deep-researcher" "TAVILY_API_KEY[concealed]=..." …), luego escribe un .env de referencias ignorado por git y apunta el lanzador a él:

# .env (gitignored) — references only, no plaintext
# TAVILY_API_KEY=op://Your Vault/ollama-deep-researcher/TAVILY_API_KEY
# …
op run --env-file .env -- node build/index.js

El mismo .env también alimenta Docker (ver más abajo), por lo que un archivo de referencias cubre ambas rutas de lanzamiento. op run solicita Touch ID una vez por lanzamiento.

C. Plantilla op inject para .mcp.json

Para hosts MCP que no pueden usar op run, copia .mcp.json.template → un archivo de trabajo, reemplaza <vault> con el nombre de tu bóveda, y luego materializa las referencias {{ op://... }} en valores reales:

op inject -i .mcp.json.template -o .mcp.json

op inject escribe la salida con modo de archivo 0600. .mcp.json está ignorado por git. Recompila después de rotar secretos en 1Password. (Requiere CLI op con soporte estándar de elementos/bóvedas; la forma op run --environment en la opción B requiere adicionalmente la beta de Entornos de 1Password.)

Docker

docker-compose.yml interpola las ocho variables del entorno. Ejecuta compose a través de op run --env-file para que las referencias op:// en .env (o el montaje FIFO, si configuraste uno en A) se resuelvan y se reenvíen al contenedor:

op run --env-file .env -- docker compose up

Referencias