Servidor MCP de Sellat: sello de tiempo para agentes de IA
Seis meses después
Un agente de IA redacta el informe de estado de un piso, lo guarda en PDF y se lo manda al propietario. Nadie lo lee con atención; para eso se puso el agente. Seis meses después el inquilino disputa la fianza y dice que ese informe se escribió después de devolver las llaves.
¿Con qué se demuestra lo contrario? Con un log en el servidor del agente, que edita cualquiera con acceso. Con la fecha de modificación del PDF, que cambia al copiarlo. Y con la palabra de quien lo encargó.
Nada que un tercero pueda comprobar solo.
Este problema ya existía cuando los documentos los hacían personas. Lo que cambia con los agentes es la cantidad, y que ya no hay nadie en medio que pueda dar fe de nada. El agente tiene que poder dejar la prueba él mismo, en el momento, sin que un humano le copie el archivo a ningún sitio.
Qué es MCP
MCP (Model Context Protocol) es un estándar abierto para que un modelo de IA use herramientas de fuera: leer un archivo, consultar una base de datos, llamar a un servicio. Lo publicó Anthropic a finales de 2024. Hoy lo hablan Claude, ChatGPT, Cursor, Gemini CLI y casi cualquier cliente de IA que te encuentres.
Antes cada aplicación de IA tenía que programar su propia integración con cada servicio. Con MCP el servicio publica un servidor que describe lo que sabe hacer, en lenguaje natural, y el modelo decide cuándo usarlo. Es una API escrita para que la lea un modelo. Si has escrito APIs para programadores, la diferencia se nota enseguida: aquí la documentación es parte del protocolo, porque quien la lee es quien decide.
Para quien no programa: con el servidor conectado, el agente puede llamar a Sellat solo, en mitad de una tarea. Tú no copias ni pegas nada.
Una herramienta que deja marca fuera
Casi todas las herramientas MCP hacen cosas dentro del sistema: buscan, calculan, escriben en algún sitio. Un sello de tiempo deja una marca fuera, en un sitio que ni el agente ni nosotros podemos tocar después.
El archivo no sale de la máquina. El servidor calcula la huella SHA-256 en local y manda solo eso. Sellat junta esa huella con otras en un árbol Merkle y ancla la raíz en Polygon y, vía OpenTimestamps, en Bitcoin. Si se pide, la FNMT-RCM emite además un sello de tiempo cualificado (eIDAS, RFC 3161) sobre la misma huella.
Lo que queda es una prueba de que esos bytes exactos existían no más tarde de la fecha anclada. Y se comprueba contra un nodo público sin fiarse de Sellat, que es el punto. Vuelve al informe del piso: si el agente lo selló al generarlo, el «se escribió después» se cae con una verificación de un minuto. Mentir sigue siendo posible. Lo que ya no es, es barato.
Hay otra cosa que me parece más interesante que sellar, aunque se le preste menos atención: el agente también puede verificar. Antes de trabajar con un documento que le llega, puede comprobar que coincide con el paquete de evidencias que lo acompaña. Un agente que trabaja con pruebas en vez de con afirmaciones.
Cómo se conecta
El servidor lo publiqué como código abierto (MIT): skanthemore/sellat-mcp. Corre en tu ordenador. A Sellat le llegan la huella, el nombre y el tamaño que salen en el certificado, y nada más. Por debajo usa sellat-cli y sellat-verify, el verificador que funciona sin conexión. Yo lo tengo funcionando en mi GPT.
[Cristian: aquí dos frases tuyas sobre por qué lo hiciste. Qué te hartaste de hacer a mano, o qué querías probar. Si no hay nada, borra este bloque.]
En Claude Desktop es un clic: descarga sellat.mcpb de la última versión y ábrelo. Trae su propio Node.js, no hay que instalar nada más. Pega tu clave de API cuando la pida; se crea gratis desde el panel de Sellat. Sin clave puedes buscar archivos, calcular huellas y verificar. Para sellar hace falta cuenta.
En Claude Code, Cursor, Gemini CLI y el resto de clientes hace falta Node.js 18 o superior:
claude mcp add sellat -e SELLAT_API_TOKEN=sellat_… -- npx -y sellat-mcp
O en el archivo de configuración MCP del cliente (.cursor/mcp.json, claude_desktop_config.json…):
{
"mcpServers": {
"sellat": {
"command": "npx",
"args": ["-y", "sellat-mcp"],
"env": { "SELLAT_API_TOKEN": "sellat_…" }
}
}
}
A partir de ahí, se habla:
«Protege con Sellat el contrato que descargué ayer.»
«¿La prueba de mi última foto ya ha llegado a Bitcoin?»
«Comprueba este archivo contra el paquete de evidencias que tengo en Descargas.»
Un archivo arrastrado al chat va al modelo, no al servidor: di dónde está guardado o deja que el agente lo busque. Estas son las herramientas que tiene a su disposición:
| Herramienta | Qué hace | Clave |
|---|---|---|
sellat_find | localiza un archivo por nombre en Descargas, Escritorio, Documentos e Imágenes; solo nombres, nunca contenidos | no |
sellat_hash | calcula la huella SHA-256 de un archivo local | no |
sellat_stamp | protege un archivo: huella en local y creación de la prueba; con qualified: true añade el sello FNMT | sí |
sellat_status | estado de una prueba: anclaje en Polygon, Bitcoin, sello y enlaces | sí |
sellat_list | las pruebas de la cuenta, de más reciente a más antigua | sí |
sellat_seal | sello de tiempo cualificado FNMT-RCM sobre una prueba existente; gasta un sello | sí |
sellat_account | plan, sellos disponibles y presupuesto de pruebas del día | sí |
sellat_download | guarda el certificado PDF, el paquete de evidencias ZIP o el .tsr del sello; nunca sobrescribe | sí |
sellat_verify | comprueba un archivo contra un proof.json, un ZIP o un id de prueba: recalcula la ruta Merkle en local y consulta el anclaje en un nodo público de Polygon | no |
Hay decisiones de diseño que solo tienen sentido porque quien llama es un agente y no una persona:
- Sellar dos veces el mismo archivo devuelve la primera prueba (la fecha anterior es la fuerte), y una llamada reintentada nunca crea una segunda prueba.
- Por el servidor MCP no se paga nada. Proteger archivos es gratis dentro del presupuesto diario de la cuenta; el sello cualificado gasta un sello (las cuentas nuevas traen uno de bienvenida) y, si no quedan, la herramienta devuelve el enlace para comprar un pack en la web. El agente tiene instrucciones de pedir un sello solo cuando tú lo has pedido.
- El servidor explica al modelo los tiempos reales: Polygon en minutos o al cierre de una franja de cuatro horas (00, 04, 08, 12, 16 y 20 h UTC) según el plan, Bitcoin unas horas después, el sello cualificado al instante. Así el agente no promete una transacción en segundos.
Qué prueba y qué no
Un sello de Sellat prueba una cosa: que esos bytes exactos existían no más tarde de la fecha del anclaje. No prueba quién los hizo ni de quién son. Eso lo ponen la firma, el contexto o el expediente donde se guarda, y conviene tenerlo claro antes de que alguien te lo discuta.
El anclaje en Polygon y Bitcoin es la capa técnica: la comprueba cualquiera, en cualquier país, con herramientas públicas. El sello cualificado es la capa legal europea: un sello de tiempo electrónico cualificado que emite la FNMT-RCM, prestador cualificado conforme a eIDAS. Sellat no es ese prestador; lo pide y guarda el sello junto a la prueba. Las dos fechas se muestran siempre por separado. Pedir el sello cualificado más tarde no retrodata nada, y no quiero que nadie se lleve otra impresión.
sellat_verify comprueba el archivo, la ruta Merkle y el anclaje, y lee la hora del bloque directamente de la cadena. Esa es la única fecha que afirma como probada. El .tsr del sello cualificado lo verifica cualquier herramienta RFC 3161; openssl ts -verify sirve.
[Cristian: aquí algo concreto que te pasó montándolo o probándolo. Un error, una sorpresa, algo que no esperabas. Una o dos frases. Si no hay nada, borra este bloque.]
Si tu agente genera, captura o manda documentos que alguien querrá discutir algún día, dale la herramienta para dejar prueba. Es una línea de configuración.
Para seguir: el servidor en GitHub · documentación de la API de Sellat · modelcontextprotocol.io