Bookstack MCP
Un servidor MCP para interactuar con Bookstack, construido con el mcp-framework para Node.js.
Documentación
Servidor MCP de BookStack
Este repositorio aloja un servidor basado en Python FastMCP que expone herramientas consolidadas para gestionar una instancia de BookStack. Las capacidades principales son los flujos de trabajo de gestión de la galería de imágenes que impulsan las experiencias de creación en clientes MCP posteriores.
Inicio rápido
# Install Python dependencies for the FastMCP server
pip install -r fastmcp_server/requirements.txt
Inicie el servidor FastMCP después de exportar sus credenciales de BookStack (ver más abajo):
cd fastmcp_server
python3 -m fastmcp_server
Entorno requerido
Copie .env.example a .env y complete estas variables antes de invocar cualquier herramienta de BookStack:
BS_URL=https://your-bookstack.example.com
BS_TOKEN_ID=...
BS_TOKEN_SECRET=...
El token de API debe pertenecer a un usuario que pueda ver y gestionar la galería de imágenes. Los scripts auxiliares locales usan set -a && source .env para que los valores también se apliquen a fragmentos de Python ad-hoc.
Herramientas de BookStack
El servidor Python FastMCP proporciona una gestión integral de BookStack a través de herramientas consolidadas:
Gestión de contenido
bookstack_content_crud— operaciones CRUD unificadas para libros, estanterías, capítulos y páginas (compatible con Letta)bookstack_list_content— listar y filtrar entidades de contenido con paginaciónbookstack_search— búsqueda de texto completo en el contenido de BookStackbookstack_batch_operations— operaciones masivas de creación, actualización y eliminación
Gestión de la galería de imágenes
bookstack_manage_images— interfaz unificada de creación/lectura/actualización/eliminación/listado de imágenesbookstack_search_images— descubrimiento avanzado con filtros de extensión, fecha, tamaño y uso
Todas las herramientas son registradas por fastmcp_server/bookstack/tools.py y se exponen automáticamente cuando el servidor FastMCP se inicia.
📘 Compatibilidad con Letta: Si está usando Letta como su cliente MCP, lea docs/LETTA_COMPATIBILITY.md para conocer los requisitos de compatibilidad importantes y las mejores prácticas.
Carga de imágenes desde URLs
bookstack_manage_images acepta tres formatos de entrada para los campos image/new_image durante las operaciones de creación y actualización:
- Cadenas base64 simples
- URLs de datos (
data:image/png;base64,...) - URLs HTTP o HTTPS
Cuando se proporciona una URL, la herramienta:
- Transmite la imagen remota con un tiempo de espera de 30 segundos y un límite de 50 MB
- Restringe los esquemas a HTTP/HTTPS y bloquea destinos internos de bucle local, privados, de enlace local, reservados y basados en redirecciones
- Valida el tipo MIME contra los formatos aceptados por BookStack (jpeg, png, gif, webp, bmp, tiff, svg+xml)
- Infiere un nombre de archivo de la ruta de la URL cuando no se proporciona uno
Parámetros requeridos de BookStack
El endpoint POST /api/image-gallery de BookStack exige dos campos adicionales además de la carga binaria:
type— debe sergallerypara imágenes de contenido estándar (usedrawiosolo al cargar PNG de diagrams.net)uploaded_to— el ID numérico de la página a la que adjuntar la imagen. BookStack rechaza cargas sin un contexto de página real.
La herramienta los presenta como entradas opcionales llamadas image_type y uploaded_to. Los valores predeterminados de gallery y 0 preservan la compatibilidad hacia atrás mientras permiten a los llamadores apuntar a páginas específicas cuando sea necesario.
Verificación manual contra una instancia en vivo
Después de exportar sus variables de entorno, puede confirmar una carga de URL de extremo a extremo con el siguiente fragmento (reemplace PAGE_ID con un ID de página existente):
cd /opt/stacks/bookstack-mcp/Bookstack-MCP
set -a && source .env && set +a
python3 - <<'PY'
import asyncio, json, time
from fastmcp import FastMCP
from fastmcp_server.bookstack.tools import register_bookstack_tools
TEST_IMAGE_URL = "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png"
PAGE_ID = 39 # replace with a page id from your BookStack instance
async def main():
mcp = FastMCP("manual-test")
register_bookstack_tools(mcp)
tool = await mcp.get_tool("bookstack_manage_images")
result = await tool.run({
"operation": "create",
"name": f"URL Upload Test {int(time.time())}",
"image": TEST_IMAGE_URL,
"uploaded_to": PAGE_ID,
})
print(json.dumps(json.loads(result.content[0].text), indent=2))
asyncio.run(main())
PY
Debería recibir una carga JSON que describa la imagen cargada, incluyendo miniaturas y el identificador uploaded_to. Un error 422 significa que BookStack rechazó la solicitud (causas comunes: falta uploaded_to, tipo MIME no permitido, imagen que excede el límite de 50 MB). Una respuesta 404 generalmente indica que el token de API carece de permisos de galería.
Pruebas
Ejecute las pruebas unitarias de Python para las herramientas de BookStack:
cd fastmcp_server
python3 -m pytest tests/test_manage_images.py -v
La suite cubre el manejo de URLs, el cumplimiento de tiempo de espera y tamaño, el rechazo de esquemas no válidos y el reenvío de metadatos type/uploaded_to.
Referencias adicionales
- Documentación de FastMCP: https://gofastmcp.com/
- Referencia de la API de BookStack: https://www.bookstackapp.com/docs/api/
- Requisitos de producto para las herramientas de la galería de imágenes:
docs/PRD-Image-Gallery-Management.md