Instalación
mcpd es un solo binario con el almacenamiento compilado dentro, así que instalarlo consiste en dejar ese binario en algún sitio y arrancarlo. Elige abajo la vía que encaje con la forma en que ya ejecutas las cosas.
Docker
Todavía no hay una versión publicada.
La imagen, el chart y los paquetes que nombran los comandos de este sitio son la distribución prevista. Ninguno se ha publicado. Lo que funciona hoy es compilar desde el código fuente, para lo que hacen falta Rust y Node:
Compilar y ejecutar
git clone https://github.com/mcpd/mcpd && cd mcpd && make build && ./target/release/mcpd demo La imagen publicada es la vía de entrada más corta, y la que da por supuesta el resto de la documentación.
docker run -p 4317:4317 -v mcpd-data:/data -e MCPD_DATA=/data/mcpd.db ghcr.io/mcpd/mcpd
El volumen importa. mcpd escribe una base de datos SQLite en la ruta que
nombra MCPD_DATA, y un contenedor sin volumen se lleva tus
trazas cuando se para. Nombrar la ruta de forma explícita cuesta un flag y
quita la duda de dónde acabó el archivo.
Cada flag tiene su variable de entorno, así que todo lo que puedes pasar en
la línea de comandos también lo puedes fijar con -e. Fija una
etiqueta en vez de seguir latest en cualquier cosa que te
importe. La imagen se construye para linux/amd64 y
linux/arm64, y Docker descarga la que corresponde a tu máquina.
Docker Compose
El mismo contenedor, puesto por escrito. Esta es la forma que conviene cuando mcpd vive junto a tu aplicación en un mismo host.
services:
mcpd:
image: ghcr.io/mcpd/mcpd:latest
restart: unless-stopped
ports:
- "4317:4317"
volumes:
- mcpd-data:/data
environment:
MCPD_DATA: /data/mcpd.db
MCPD_PROJECT: default
# Set these before this port is reachable by anything but you.
# MCPD_INGEST_KEYS: key-for-your-agents
# MCPD_READ_KEYS: key-for-your-team
# MCPD_RETENTION_DAYS: 30
volumes:
mcpd-data: Las tres claves comentadas son las que hay que rellenar antes de que esto llegue a una red donde haya alguien más. Sin ninguna clave definida, la ingesta y las lecturas quedan abiertas, lo que es correcto en tu portátil y equivocado en cualquier otro sitio. Despliegue cuenta qué definir y por qué.
Kubernetes
Cada versión sube el chart al mismo registro que la imagen, como artefacto OCI, así que no hay ningún repositorio que añadir antes. El chart se niega a instalarse sin una clave de ingesta y una clave de lectura, así que genera las dos primero.
helm install mcpd oci://ghcr.io/mcpd/charts/mcpd -n mcpd --create-namespace --set keys.ingest=$INGEST_KEY --set keys.read=$READ_KEY
mcpd atiende SIGTERM y se apaga de forma ordenada, que es lo
que envía Kubernetes. Expone /healthz para liveness y
/readyz para readiness, y los dos son distintos a propósito:
liveness nunca toca el almacenamiento, así que una base de datos lenta no
puede meter el pod en un bucle de reinicios. Los valores, las sondas y la
forma del Deployment están en
Docker y Kubernetes.
Un binario de una versión publicada
Cada versión adjunta un archivo para Linux en x86_64 y arm64, estático y
compilado contra musl para que no haya libc que casar, y para macOS en Apple
silicon e Intel. Los acompañan un archivo SHA256SUMS y una
atestación de procedencia de la build. Descomprime el archivo de tu máquina
y ejecuta ./mcpd; sin argumentos arranca el daemon.
No existe cargo install mcpd. No se publica nada en crates.io,
y un crate compilado desde el registro no podría llevar la interfaz, que se
construye con npm y se compila dentro del binario. Si tienes una cadena de
herramientas de Rust, compila desde el código fuente.
Desde el código fuente
Clona el repositorio y lanza la build de distribución. Usa optimización
completa en el enlazado y una sola unidad de generación de código, lo que
tarda más en compilar y produce el binario más pequeño y más rápido. Pasa
por make y no por cargo directamente: la interfaz
se compila dentro del binario, y make dist la construye antes,
que es el paso que un cargo build a secas sobre un clon recién
hecho no tiene forma de dar. Ese paso necesita Node y npm en la máquina,
además de la cadena de herramientas de Rust.
git clone https://github.com/mcpd/mcpd && cd mcpd && make dist
El binario se escribe en target/dist/mcpd, o en
target/release/mcpd si tomaste la vía rápida. Usa
make build mientras trabajas en mcpd y
make dist para cualquier cosa que pienses ejecutar.
Dónde van los datos
--data es la ruta del archivo SQLite, y por defecto es
./mcpd.db en el directorio de trabajo. Los directorios padre se
crean solos.
Pasar :memory: mantiene todo en memoria y no escribe nada en
disco. Es la opción correcta para una suite de pruebas, para una
demostración en la máquina de otra persona y para cualquier ejecución cuyos
prompts prefieras no dejar atrás. El almacén desaparece con el proceso, que
es justo de lo que se trata.
No dejar rastro
mcpd --data :memory: mcpd demo llena el almacén con una ejecución fallida realista y
después sirve, así la interfaz tiene algo dentro la primera vez que la
abres.
Comprueba qué hará antes de arrancarlo
mcpd config imprime la configuración a la que se resuelve esta
invocación y luego sale. Los flags, las variables de entorno y los valores
por defecto acaban todos en un mismo listado, así que puedes ver cuál ganó
sin arrancar nada.
$ mcpd configlisten 0.0.0.0:4317storage sqlite at ./mcpd.dbconfig file nonelog format textproject defaultprojects noneretention foreveringest auth openread auth openwrite auth openadmin auth openexecute auth openworker auth opensignup offruns sqlite at ./mcpd.runs.dbrun settings lease_ttl_ms 30000, reclaim_window_ms 30000, stall_window_ms 300000, idempotency_window_ms 86400000, park_ttl_ms 86400000, max_depth 8, max_step_repeats 16identity offclient ip peer addresssampling keep everythingquota unlimitedredaction onredact key built in, which is public; set --redact-keycors same-origin onlytimeout 30s per requestlimits 32 MiB per request, 10000 signals per batchderived duration and token metricsaspects offmonitors noneobjectives nonejudge offforwarding off Comprueba la instalación
/healthz es la respuesta a «¿está funcionando de verdad?».
Nunca lee del almacenamiento, así que se mantiene rápida y sigue hablando
del proceso y no del disco.
$ curl -s localhost:4317/healthz{"status":"ok","version":"0.1.0","spec_version":"1.0.0","uptime_seconds":8,"storage":"sqlite"}$ curl -s -o /dev/null -w "%{http_code}\n" localhost:4317/readyz200 spec_version es la versión del modelo de datos que implementa
esta build. Un cliente puede leerla y negarse a hablar con un servidor que
no entiende, que es mejor que enviar un lote al que van a rechazar campo a
campo.
/readyz es la otra mitad. Consulta el almacenamiento y responde
503 cuando no está disponible, así un balanceador de carga deja
de mandar lecturas a una instancia que no puede servirlas. Usa
/healthz para liveness y /readyz para readiness,
nunca la misma para las dos cosas.
Luego abre localhost:4317 y ya estás viendo la interfaz.
A continuación
- Envíale una traza desde tu propio agente: Inicio rápido.
- Aprende las palabras que usa el resto de la documentación: Conceptos.
- Todos los flags y variables de entorno en una tabla: Configuración.
- Antes de que nadie más pueda alcanzar el puerto: Docker y Kubernetes.