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-researcherEste 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
-
Clona el repositorio e instala las dependencias:
git clone <your-repo-url> cd mcp-server-ollama-deep-researcher npm install -
Instala las dependencias de Python para el asistente:
cd src/assistant pip install -r requirements.txt # or use pyproject.toml/uv if preferred -
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.
- Para Tavily:
-
Compila el servidor TypeScript (si es necesario):
npm run build -
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
researchcon{ "topic": "Your subject" }
- Usa la herramienta
- Obtén el estado de la investigación:
- Usa la herramienta
get_status
- Usa la herramienta
- Configura los parámetros de investigación:
- Usa la herramienta
configurecon cualquiera de:maxLoops,llmModel,searchApi
- Usa la herramienta
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
stderrpara 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_KEYoEXA_API_KEYesté 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_KEY | sí |
OLLAMA_BASE_URL, LANGSMITH_TRACING, LANGSMITH_ENDPOINT, LANGSMITH_PROJECT | no |
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.
- En la aplicación de escritorio de 1Password, abre tu Entorno → Destinos → Archivo
.envlocal → Elegir ruta de archivo →.env→ Montar. Verifica concat .env(aprueba mediante Touch ID; la autenticación dura hasta que 1Password se bloquee). .1password/environments.toml(confirmado) le dice al hook qué rutas validar — ya configurado enmount_paths = [".env"].- Instala el hook de validación localmente:
Esto creagit clone https://github.com/1Password/agent-hooks /tmp/agent-hooks /tmp/agent-hooks/install.sh --agent claude-code --target-dir ..claude/claude-code-1password-hooks-bundle/y.claude/settings.json(ambos ignorados por git). El hook es fail-open: si 1Password osqlite3no están disponibles, permite la ejecución, por lo que los contribuyentes que no usan 1Password no se ven afectados. - 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,denycon 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
opcarece de--environment(el subcomandoenvironmentes parte de la beta de Entornos de 1Password y está ausente en algunas compilaciones, por ejemplo,opv2.34.x): usaop run --env-file .envcontra un.envsimple de referenciasop://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.envde 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.jsEl mismo
.envtambién alimenta Docker (ver más abajo), por lo que un archivo de referencias cubre ambas rutas de lanzamiento.op runsolicita 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
- Descripción general de la arquitectura DXT
- Especificación del manifiesto DXT
- Ejemplos de extensiones DXT
- SDK del Protocolo de Contexto de Modelo