Ir al contenido
mcpd
sin daemon
Código

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.

compose.yaml
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.

configuración resuelta
$ 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.

comprobación
$ 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