Skip to main content
Glama
JohnGilligan2

mcp-exports

mcp-exports

Host de descarga compartido y de un solo uso para los servidores MCP de la casa.

https://exports.example.com · puerto del host 8114 · sin inicio de sesión para clientes

MCP server  --POST /put  (service token)-->  mcp-exports  -->  download URL
customer    --GET  /d/{token} (no auth)  -->  mcp-exports  -->  the file, once

Por qué existe

Una herramienta que devuelve una semana de registros de llamadas en línea cuesta ~530 000 tokens; los mismos datos como CSV pesan 1 MB y se generan en 1,6 segundos. Por eso las exportaciones devuelven un enlace. La primera versión servía ese enlace desde el propio servidor MCP, lo que fallaba de tres maneras:

  1. Los hosts MCP están detrás de una lista de permisos de IP solo de Anthropic, pero quien descarga un archivo es el navegador de un cliente desde una dirección arbitraria. Un nombre de host separado evita que las dos políticas de acceso se pisen, en lugar de abrir una excepción de ruta en una configuración de proxy que además lleva los ajustes de streaming que MCP necesita.

  2. Los contenedores MCP se vuelven a desplegar en cada push, y un almacén en memoria moría con ellos, invalidando enlaces activos a mitad de una conversación.

  3. El almacén pertenecía a un solo proceso, así que un segundo worker daba 404 al azar.

Related MCP server: agent-secret

Modelo de seguridad, dicho claro

Una URL de descarga es una capacidad: quien la tenga consigue el archivo, sin inicio de sesión. Misma disyuntiva que las URLs de grabaciones de NetSapiens y los PDF del portal de Odoo que ya repartimos, y es lo que hace que un enlace funcione al hacer clic desde una ventana de chat. No es autenticación, y las debilidades son reales: una URL puede reenviarse, quedar registrada en un proxy o permanecer en una transcripción para siempre.

Así que el diseño se apoya en lo que de verdad ayuda:

Control

Por qué

Un solo uso (por defecto max_downloads=1)

Los bytes se eliminan al descargarse, así que un enlace filtrado después ya está muerto. El control más fuerte disponible, porque una URL de capacidad no se puede dejar de compartir.

TTL corto — 1 h datos, 15 min financiero

Reduce la ventana. El dinero recibe menos.

Tokens de 256 bits secrets.token_urlsafe

No se pueden adivinar ni enumerar

404 idéntico para ausente / malformado / caducado / gastado

Nada que se pueda deducir de la diferencia

Content-Disposition: attachment siempre

Una exportación HTML o SVG nunca debe renderizarse en nuestro origen: eso convertiría este host en un vector de XSS almacenado

no-store, noindex, nosniff, no-referrer

Sin caché, sin indexar, sin fugas de referer

Registro de acceso con solo el prefijo del token

Suficiente para correlacionar subida↔descarga; no suficiente para reconstruir una URL funcional a partir de un registro que más gente puede leer que el propio archivo

La subida está autenticada — un token bearer por servidor, porque publicar archivos en un host público no es algo que se le permita a Internet. El servicio se niega a arrancar con una lista de permisos vacía.

API

POST /put?filename=x.csv&sensitivity=data|financial&customer=Acme%20Movers
     &ttl=3600&max_downloads=1
     Authorization: Bearer <server token>
  -> 201 {download_url, filename, size, expires_in_seconds, expires_at,
          max_downloads, single_use}

GET  /d/{token}   -> 200 the file (then it is gone), or 404
GET  /healthz     -> counters + bytes held

El ttl se limita, no se obedece — pide una semana, recibe MCP_EXPORTS_TTL_MAX, y la respuesta te dice lo que realmente has recibido.

Cómo usarlo desde un servidor MCP

Copia client/export_client.py en el servidor y define MCP_EXPORTS_URL + MCP_EXPORTS_TOKEN. ExportClient.from_env() devuelve None cuando no está configurado, de modo que un servidor puede ofrecer herramientas de exportación solo donde el host esté realmente conectado, en lugar de anunciar una herramienta que siempre falla.

Lanza una excepción en lugar de degradarse a filas en línea: si el host está caído no hay degradación segura, porque devolver las filas es el modo de fallo que las exportaciones existen para evitar.

Despliegue

Portainer → Stacks → Repository, refs/heads/main, puerto 8114. Genera un token por servidor MCP:

python -c "import secrets; print(secrets.token_urlsafe(32))"

NPM: exports.example.com10.0.0.10:8114, sin Lista de Acceso (esa es la gracia), Websockets desactivados, timeouts estándar.

Pruebas

python -m pytest tests -q

47 pruebas, sin red. Cubren específicamente las propiedades de seguridad: el uso único borra los bytes de verdad, todas las formas de token inválido son indistinguibles, los nombres de archivo no pueden escapar ni inyectar cabeceras, el TTL financiero es más corto, y el Dockerfile hace chown del punto de montaje del volumen antes de soltar el usuario root — sin lo cual un volumen con nombre llegaría con propietario root y cada subida fallaría con EACCES.

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Provides secure OAuth2-based credential management for MCP servers, allowing agents to obtain short-lived token references without exposing raw secrets.
    7
    18
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for one-time secret sharing, enabling AI agents to securely claim and store secrets (e.g., API keys) via claim codes without exposing them in chat transcripts.
    3
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables sharing self-contained HTML files via public or access-key-protected private links. Provides MCP tools to create shares, retrieve public share metadata, and describe the service.
    2
  • F
    license
    Not graded
    quality
    B
    maintenance
    MCP server for end-to-end encrypted secret storage and retrieval, enabling LLM agents to fetch secrets by name via one-time URLs while keeping plaintext out of model context and logs.
    1

View all related MCP servers

Related MCP Connectors

  • An authenticated remote MCP server for user-owned devices and one-shot capability invocation.

  • MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.

  • Remote MCP for C2PA intake verifier MCP, structured receipts, audit logs, and reviewer-ready evidenc

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JohnGilligan2/mcp-exports'

If you have feedback or need assistance with the MCP directory API, please join our Discord server