本文へスキップ
mcpd
デーモンなし
ソース

インストール

mcpd はストレージを組み込んだ 1 つのバイナリなので、インストールとは、そのバイナリをどこかに置いて起動することです。以下から、いま運用しているやり方に合う道を選んでください。

Docker

リリースはまだありません。

このサイトのコマンドが指すイメージ、チャート、パッケージは予定している配布物であり、どれも公開されていません。今動くのはソースからのビルドで、Rust と Node が必要です。

ビルドして実行

git clone https://github.com/mcpd/mcpd && cd mcpd && make build && ./target/release/mcpd demo

公開されたイメージがいちばん短い入口で、以降のドキュメントもこれを前提にしています。

docker run -p 4317:4317 -v mcpd-data:/data -e MCPD_DATA=/data/mcpd.db ghcr.io/mcpd/mcpd

ボリュームは重要です。mcpd は MCPD_DATA が指すパスに SQLite のデータベースを書きます。ボリュームのないコンテナは、停止するときにトレースも一緒に持っていきます。パスを明示するのはフラグ 1 つ分の手間で、ファイルがどこへ行ったのかという疑問がなくなります。

どのフラグにも環境変数があるので、コマンドラインで渡せるものは -e でも設定できます。大事なものでは latest を追いかけず、タグを固定してください。イメージは linux/amd64 と linux/arm64 向けにビルドしてあり、Docker は手元のマシンに合うほうを取得します。

Docker Compose

同じコンテナを書き下したものです。mcpd を 1 台のホストでアプリケーションの隣に置くときは、この形を使います。

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
      # このポートに自分以外の誰かが届くようになる前に、次の 3 つを設定してください。
      # MCPD_INGEST_KEYS: key-for-your-agents
      # MCPD_READ_KEYS: key-for-your-team
      # MCPD_RETENTION_DAYS: 30

volumes:
  mcpd-data:

コメントにしてある 3 つのキーは、自分以外の人がいるネットワークに出す前に埋めるものです。キーを何も設定しなければ、取り込みも読み取りも開いたままです。手元のノート PC では正しく、それ以外の場所では誤りです。何を設定し、なぜそうするのかはデプロイで扱います。

Kubernetes

リリースのたびに、チャートはイメージと同じレジストリへ OCI アーティファクトとして push されます。先に追加するリポジトリはありません。チャートは取り込みキーと読み取りキーがないとインストールを拒否するので、先に両方を生成してください。

helm install mcpd oci://ghcr.io/mcpd/charts/mcpd -n mcpd --create-namespace --set keys.ingest=$INGEST_KEY --set keys.read=$READ_KEY

mcpd は SIGTERM を処理して正常に終了します。Kubernetes が送るのはこのシグナルです。liveness には /healthz、readiness には /readyz を公開しており、この 2 つは意図して別物です。liveness はストレージに一切触らないので、データベースが遅くても Pod が再起動を繰り返すことはありません。values、プローブ、Deployment の形は Docker と Kubernetes にあります。

リリースのバイナリ

リリースのたびに、x86_64 と arm64 の Linux 向けのアーカイブと、Apple シリコンと Intel の macOS 向けのアーカイブを添付します。Linux 向けは musl に対してビルドした静的バイナリなので、合わせる libc はありません。SHA256SUMS ファイルとビルドの来歴証明も一緒に付きます。自分のマシン向けのアーカイブを展開して ./mcpd を実行してください。引数なしで実行するとデーモンが起動します。

cargo install mcpd はありません。crates.io には何も公開しておらず、レジストリからビルドしたクレートにはインターフェースを含められません。インターフェースは npm でビルドし、バイナリに組み込むものだからです。Rust のツールチェーンがあるなら、代わりにソースからビルドしてください。

ソースから

リポジトリをクローンして配布用ビルドを実行します。リンク時最適化を全面的に使い、コード生成ユニットを 1 つにするので、コンパイルは遅くなりますが、小さくて速いバイナリができます。cargo を直接ではなく make を通してください。インターフェースはバイナリに組み込まれており、make dist は先にそれをビルドします。クローンしたばかりの状態で cargo build だけを実行しても、この手順は行えません。この手順には、Rust のツールチェーンに加えて Node と npm が必要です。

git clone https://github.com/mcpd/mcpd && cd mcpd && make dist

バイナリは target/dist/mcpd に、速いほうを選んだ場合は target/release/mcpd に書かれます。mcpd 自体に手を入れている間は make build を、実際に動かすものには make dist を使ってください。

データの置き場所

--data は SQLite ファイルのパスで、既定は作業ディレクトリの ./mcpd.db です。親ディレクトリは自動で作られます。

:memory: を渡すと、すべてがメモリ上に置かれ、ディスクには何も書きません。テストスイート、他人のマシンでのデモ、そしてプロンプトを残したくない実行には、これが正しい選択です。ストアはプロセスと一緒に消えます。それが狙いです。

何も残さない

mcpd --data :memory:

mcpd demo は、実際にありそうな失敗した実行をストアに入れてから待ち受けます。最初にインターフェースを開いたときに、中身があるようにするためです。

起動する前に、何をするか確かめる

mcpd config は、その呼び出しで解決される設定を表示して終了します。フラグ、環境変数、既定値がひとつの一覧にまとまるので、何も起動せずに、どれが勝ったのかを確認できます。

解決された設定
$ 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

インストールを確認する

/healthz は「本当に動いているのか」への答えです。ストレージを読まないので、速いままで、ディスクではなくプロセスについて正直なままです。

確認
$ 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 は、このビルドが実装しているデータモデルのバージョンです。クライアントはこれを読んで、理解できないサーバーとの通信を断れます。フィールドごとに拒否されるバッチを送るよりも、そのほうが良い結果になります。

/readyz はもう半分です。ストレージに疎通確認を行い、ストアに届かないときは 503 を返すので、読み取りに応えられないインスタンスへロードバランサーが読み取りを送らなくなります。liveness には /healthz、readiness には /readyz を使い、両方に同じものを使わないでください。

あとは localhost:4317 を開けば、そこがインターフェースです。

次に

  • 自分のエージェントからトレースを送る:クイックスタート。
  • 以降のドキュメントで使う言葉を知る:概念。
  • すべてのフラグと環境変数をひとつの表で:設定。
  • ポートに他の人が届くようになる前に:Docker と Kubernetes。