Outline MCP Server
by bysonte
README.md
# Outline MCP Server
Servidor [Model Context Protocol](https://modelcontextprotocol.io/) para integrar [Outline](https://www.getoutline.com/) con clientes MCP. Permite que un asistente o agente compatible consulte, busque y gestione documentos de una instancia de Outline mediante su API.
## Para Qué Sirve
Este servidor actúa como puente entre un cliente MCP y Outline. Una vez configurado, el cliente puede invocar herramientas para leer documentación interna, buscar contenido, crear notas, actualizar documentos y consultar colecciones.
Casos de uso típicos:
- Consultar la base de conocimiento de Outline desde un asistente de IA.
- Buscar documentación interna sin salir del cliente MCP.
- Crear o actualizar documentos en Markdown desde flujos automatizados.
- Usar Outline como memoria documental editable para agentes.
## Características
- Lectura de documentos por ID.
- Búsqueda de texto en documentos de Outline.
- Listado de documentos, con filtro opcional por colección.
- Creación de documentos con contenido Markdown.
- Actualización de título, contenido y estado de publicación.
- Eliminación de documentos.
- Listado de colecciones.
- Consulta de información de una colección concreta.
- Transporte MCP por `stdio` por defecto, ideal para clientes locales.
- Transporte Streamable HTTP opcional para despliegues remotos.
- Modo solo lectura para ocultar herramientas de escritura.
- Timeout HTTP y reintentos acotados ante errores temporales de Outline.
- Validación de argumentos con esquemas Zod mediante el SDK MCP actual.
## Requisitos
- Node.js `>=18`.
- Una instancia de Outline accesible por URL.
- Un token de API de Outline con permisos suficientes para las operaciones que quieras usar.
## Instalación Rápida Con npx
La forma más sencilla es configurarlo directamente en tu cliente MCP usando `npx`:
```json
{
"mcpServers": {
"outline": {
"command": "npx",
"args": ["-y", "getoutline-mcp-server"],
"env": {
"OUTLINE_BASE_URL": "https://tu-instancia-outline.com",
"OUTLINE_API_KEY": "tu-token-de-api"
}
}
}
}
```
## Instalación Desde Código Fuente
```bash
npm install
npm run build
npm start
```
Para desarrollo:
```bash
npm run dev
```
Para recompilar automáticamente mientras editas:
```bash
npm run watch
```
## Configuración
El servidor lee la configuración desde variables de entorno:
```bash
OUTLINE_BASE_URL=https://tu-instancia-outline.com
OUTLINE_API_KEY=tu-token-de-api
OUTLINE_READ_ONLY=false
MCP_TRANSPORT=stdio
MCP_HTTP_HOST=127.0.0.1
MCP_HTTP_PORT=3000
MCP_HTTP_PATH=/mcp
OUTLINE_MAX_RETRIES=2
OUTLINE_RETRY_BASE_DELAY_MS=100
# OUTLINE_HTTP_TIMEOUT_MS=10000
```
Puedes tomar `env.example` como referencia.
Variables disponibles:
| Variable | Default | Descripción |
| --- | --- | --- |
| `OUTLINE_BASE_URL` | requerido | URL base de tu instancia de Outline. |
| `OUTLINE_API_KEY` | requerido | Token de API de Outline. No se imprime en logs. |
| `OUTLINE_READ_ONLY` | `false` | Si es `true`, no registra `outline_create_document`, `outline_update_document` ni `outline_delete_document`. |
| `MCP_TRANSPORT` | `stdio` | Transporte MCP: `stdio` o `http`. Valores inválidos fallan al arrancar. |
| `MCP_HTTP_HOST` | `127.0.0.1` | Host de escucha para Streamable HTTP. Usa `0.0.0.0` solo si el despliegue lo protege correctamente. |
| `MCP_HTTP_PORT` | `3000` | Puerto HTTP cuando `MCP_TRANSPORT=http`. |
| `MCP_HTTP_PATH` | `/mcp` | Path HTTP del endpoint MCP. Debe empezar con `/`. |
| `OUTLINE_MAX_RETRIES` | `2` | Reintentos máximos por endpoint para `429`, `5xx` y errores transitorios de red. Usa `0` para desactivar. |
| `OUTLINE_RETRY_BASE_DELAY_MS` | `100` | Delay base para backoff acotado entre reintentos. |
| `OUTLINE_HTTP_TIMEOUT_MS` | sin valor | Timeout opcional en milisegundos para Axios. |
### Modo Solo Lectura
Con `OUTLINE_READ_ONLY=true`, el servidor no expone las herramientas de escritura en `tools/list`. Las herramientas ocultas son `outline_create_document`, `outline_update_document` y `outline_delete_document`.
Aunque actives este modo, usa también un token de Outline con permisos mínimos de lectura siempre que tu instancia lo permita.
### Transporte Streamable HTTP
`stdio` sigue siendo el transporte por defecto y no requiere configurar variables HTTP. Para exponer el servidor por Streamable HTTP:
```bash
MCP_TRANSPORT=http
MCP_HTTP_HOST=127.0.0.1
MCP_HTTP_PORT=3000
MCP_HTTP_PATH=/mcp
npm start
```
El endpoint queda disponible en `http://127.0.0.1:3000/mcp` con transporte Streamable HTTP del SDK MCP. Si necesitas exponerlo fuera de la máquina local, cambia `MCP_HTTP_HOST`, por ejemplo a `0.0.0.0`, y protege el acceso desde la red o un proxy.
Este cambio no agrega autenticación propia al endpoint HTTP. En producción, publícalo solo detrás de una red confiable, VPN, reverse proxy con autenticación, reglas de firewall o controles equivalentes.
### Timeout Y Reintentos
El cliente de Outline puede reintentar errores temporales: `429`, `500`, `502`, `503`, `504`, `ECONNRESET`, `ETIMEDOUT` y `ECONNABORTED`. No reintenta errores permanentes como `400`, `401` o `403`.
Configura `OUTLINE_MAX_RETRIES=0` para desactivar reintentos. Define `OUTLINE_HTTP_TIMEOUT_MS` solo si quieres imponer un timeout explícito a las llamadas HTTP hacia Outline.
### Cómo Obtener El Token De Outline
1. Entra en tu instancia de Outline.
2. Abre `Settings`.
3. Ve a `API Tokens`.
4. Crea un token nuevo.
5. Usa ese valor como `OUTLINE_API_KEY`.
Recomendación: crea un token con los permisos mínimos necesarios para tu caso de uso.
## Configuración En Clientes MCP
### Cliente Local Con npx
```json
{
"mcpServers": {
"outline": {
"command": "npx",
"args": ["-y", "getoutline-mcp-server"],
"env": {
"OUTLINE_BASE_URL": "https://tu-instancia-outline.com",
"OUTLINE_API_KEY": "tu-token-de-api"
}
}
}
}
```
### Cliente Local Desde Este Repositorio
Primero compila el proyecto:
```bash
npm run build
```
Luego apunta el cliente al archivo compilado:
```json
{
"mcpServers": {
"outline": {
"command": "node",
"args": ["/ruta/absoluta/outline-mcp-server/dist/index.js"],
"env": {
"OUTLINE_BASE_URL": "https://tu-instancia-outline.com",
"OUTLINE_API_KEY": "tu-token-de-api"
}
}
}
}
```
En Windows, usa una ruta absoluta válida, por ejemplo:
```json
"args": ["D:/work/outline-mcp-server/dist/index.js"]
```
### OpenCode
OpenCode usa una forma de configuración distinta a otros clientes MCP: el comando va como un array único y las variables del proceso van en `environment`, no en `env`.
Ejemplo para `C:\Users\gbaso\.config\opencode\opencode.json`:
```json
{
"mcp": {
"outline": {
"type": "local",
"command": [
"node",
"D:/work/outline-mcp-server/dist/index.js"
],
"enabled": true,
"environment": {
"OUTLINE_BASE_URL": "https://tu-instancia-outline.com",
"OUTLINE_API_KEY": "tu-token-de-api"
}
}
}
}
```
Si usas `env` en OpenCode, el servidor puede arrancar sin `OUTLINE_BASE_URL` y `OUTLINE_API_KEY`, fallar al inicio y aparecer en logs como `server unavailable key=outline type=local status=failed`.
Los logs de OpenCode en Windows están en:
```text
C:\Users\gbaso\.local\share\opencode\log\opencode.log
```
Después de modificar `opencode.json`, reinicia OpenCode. La configuración de MCP se carga al inicio y no se recarga en caliente.
## Herramientas Disponibles
### `outline_get_document`
Obtiene un documento por ID.
Parámetros:
- `id`: ID del documento.
Ejemplo:
```json
{
"name": "outline_get_document",
"arguments": {
"id": "document-id"
}
}
```
### `outline_search_documents`
Busca documentos en Outline.
Parámetros:
- `query`: texto de búsqueda.
- `limit`: número máximo de resultados. Por defecto `25`, máximo `100`.
Ejemplo:
```json
{
"name": "outline_search_documents",
"arguments": {
"query": "documentación del proyecto",
"limit": 10
}
}
```
### `outline_list_documents`
Lista documentos, opcionalmente filtrados por colección.
Parámetros:
- `collectionId`: ID opcional de la colección.
- `limit`: número máximo de resultados. Por defecto `25`, máximo `100`.
### `outline_create_document`
Crea un documento con contenido Markdown.
Parámetros:
- `title`: título del documento.
- `text`: contenido en Markdown.
- `collectionId`: ID opcional de la colección.
- `parentDocumentId`: ID opcional del documento padre.
- `publish`: si debe publicarse inmediatamente. Por defecto `false`.
Ejemplo:
```json
{
"name": "outline_create_document",
"arguments": {
"title": "Plan del proyecto",
"text": "# Plan\n\nContenido inicial del documento.",
"collectionId": "collection-id",
"publish": true
}
}
```
### `outline_update_document`
Actualiza un documento existente.
Parámetros:
- `id`: ID del documento.
- `title`: nuevo título, opcional.
- `text`: nuevo contenido Markdown, opcional.
- `publish`: cambia el estado de publicación, opcional.
### `outline_delete_document`
Elimina un documento por ID.
Parámetros:
- `id`: ID del documento.
### `outline_list_collections`
Lista todas las colecciones disponibles.
No requiere parámetros.
### `outline_get_collection`
Obtiene información de una colección por ID.
Parámetros:
- `id`: ID de la colección.
## Desarrollo
Estructura principal:
```text
src/
├── index.ts # Servidor MCP y registro de herramientas
└── outline-client.ts # Cliente HTTP para la API de Outline
```
Scripts disponibles:
- `npm run build`: compila TypeScript en `dist/`.
- `npm test`: ejecuta la suite Vitest sin credenciales reales de Outline.
- `npm run test:coverage`: ejecuta tests con cobertura global mínima del 85%.
- `npm start`: ejecuta `dist/index.js`.
- `npm run dev`: compila y ejecuta el servidor.
- `npm run watch`: recompila al detectar cambios.
## Seguridad
- No incluyas `OUTLINE_API_KEY` en commits, logs ni documentación pública.
- Usa variables de entorno o el sistema de secretos de tu cliente MCP.
- Evita tokens con permisos excesivos si el cliente solo necesita lectura.
- Ten cuidado con herramientas de escritura o borrado: el servidor puede modificar tu instancia de Outline.
- Si usas `MCP_TRANSPORT=http`, protege el endpoint con controles externos; el servidor no implementa autenticación HTTP propia.
## Limitaciones Actuales
- No implementa rate limiting interno; si haces muchas llamadas, depende de los límites de Outline.
- Las respuestas de Outline se devuelven como JSON de la API, con tipos TypeScript pragmáticos pero sin validación runtime exhaustiva de cada campo.
- El transporte HTTP es stateless; no agrega sesiones persistentes ni autenticación propia.
## Licencia
MIT. Consulta `LICENSE` para más detalles.
TDQS
A3.6/5.0
Scored across 8 tools
Disambiguation5/5
Each tool targets a distinct resource (document or collection) and action (create, delete, get, list, search, update), with no overlap or ambiguity.
Naming Consistency5/5
All tools follow a consistent 'outline_verb_noun' pattern using snake_case, making the naming predictable and easy to understand.
Tool Count5/5
8 tools are well-scoped for an Outline knowledge base server, covering essential document operations and collection queries without unnecessary bloat.
Completeness4/5
Document CRUD and search are complete, but collection management is limited to get and list, missing create/update/delete for collections, which is a minor gap.
Maintenance
ActivityInactive
ResponsivenessNo issues