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

概要

エージェントの隣で動かすプロセスであって、エージェントをその周りに組み立てるライブラリではありません。ステップ間の実行を保持し、そのひとつずつを記録します。このページを読めば、全体の形がひととおり分かります。

1 つのプロセス

mcpd は 1 つのプロセスで 2 つのことをします。ひとつは、永続実行をステップ間で保持することです。カーソル、リトライ、タイマー、待機がそれにあたり、各ステップの中身は任意の言語のあなた自身のコードが担当します。もうひとつは、エージェントがしたことを受け取って保存し、読める実行として返すことです。SQLite をリンクした 1 つのバイナリで、立ち上げるデータベースも、横で動かすコレクターも、どこかのアカウントもありません。

デーモンはポート 4317 で待ち受け、その 1 つのポートから 5 つのものを提供します。

  • /v1/traces、/v1/logs、/v1/metrics での OTLP 取り込み。すでにある OpenTelemetry の構成に、新しいコードは要りません。
  • /v1/ingest でのネイティブ取り込み。OTLP に置き場所のないモデルの部分を運びます。スコアや人によるフィードバックもここに入ります。
  • /v1/api 以下の読み取り API。インターフェースも SDK もこれを使います。あなたが手にするものの裏に、非公開の API はありません。
  • /v1/api/runs、/v1/api/events、/v1/api/steps 以下の実行の面。定義、実行、待機に応えるイベント、そしてワーカーが話すプロトコルです。ワークフローを参照してください。
  • / にある運用者向けインターフェース。バイナリに組み込まれています。

ポートを 1 つにしたのは近道ではなく、デプロイ上の判断です。コレクターとデータベースと UI があれば、動かすものが 3 つ、上げるものが 3 つ、そしてトレースが失われうる隙間が 3 か所になります。

リリース後は、これがインストールのすべて

docker run -p 4317:4317 ghcr.io/mcpd/mcpd

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

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

ビルドして実行

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

あえてそうではないもの

ここでの価値の多くは、mcpd がやらないと決めたことから来ています。ひとつ断るごとに、あなたがエージェントを変えなければならない理由がひとつ減ります。

  • フレームワークではありません。mcpd があなたのモデルを実行することも、選ぶことも、プロバイダーのクライアントを包むこともありません。ステップ間の実行を保持し、ステップの中身はすべてあなたのコードに任せます。mcpd を採り入れたあとも、コードからのモデルの呼び方は前と同じです。
  • リクエストの経路にいません。エージェントとプロバイダーの間に入ることはありません。利用者が見るものは、何ひとつ mcpd が動いていることに依存しません。利用者が見るものは、そこを通らないからです。
  • サービスではありません。デーモンは既定では何も呼び出しません。テレメトリーも、ライセンスの確認も、ベンダーのエンドポイントもありません。外に出る通信は、あなたが設定したものだけです。--forward-endpoint、モニターの webhook、ジャッジモデルがそれにあたります。どれも設定しなければ、プロンプトは動かしたマシンから出ません。
  • 必須の依存ではありません。インフラから mcpd を消しても、止まるのは記録だけです。

6 つのシグナル

mcpd は 6 種類のものを、まとめて保存します。スパンは何が動いたか。ログは実行が出した行。メトリクスは時間に沿った数値。スコアは実行に対する機械の判断。フィードバックは人の判断。観点ノートは、終わった実行についてモデルが書いた 1 文です。

1 つのストアに置くことが要点です。どのシグナルも、自分が属する trace id と span id を持ちます。だから「この顧客が苦情を寄せた実行で、モデルは実際に何と言い、いくらかかったのか」という問いは、4 つのツールと目で合わせるタイムスタンプではなく、1 つのクエリになります。

  • Spans

    What ran, nested, with timings

  • Logs

    Lines the run emitted

  • Metrics

    Numbers, with exemplars back to a run

  • Scores

    Machine evaluation

  • Feedback

    What a person thought

  • Aspect notes

    A sentence a model wrote about the run

trace_id Store Search Export

スコアとフィードバックは意図して分けてあります。スコアラーの 0.8 と人の低評価は別のものを測っており、平均を取れば意味のない数値になります。

フレームワークではなくデーモンである理由

フレームワークの可観測性は良いものですが、そのフレームワークに付いてきます。見えるようにするには、エージェントがそれで作られていること、たいていは 1 つの言語で作られていることが前提になります。新しいプロジェクトには公平な取引で、すでに存在して動いているエージェントには成り立たない取引です。フレームワークのワークフローも同じ取引です。すべてのステップがそのフレームワークの言語で書かれ、そのプロセスの中で動く限りは永続します。

デーモンはその両方をひっくり返します。ワークフローのグラフはデーモンが持つデータで、ステップの本体はあなたのプロセスが持つコードです。本体は、どの言語でも話せる HTTP のプロトコルで、リースを 1 件ずつ引き受けます。デーモンがモデルもプロンプトも資格情報も見ることはありません。ワークフローとワーカーを参照してください。

デーモンはこの取引もひっくり返します。mcpd が話す OTLP は依存ではなくプロトコルなので、どの言語で書かれ、どのフレームワークを使ったエージェントでも記録できます。mcpd が存在する前に書かれたものも含みます。エージェントがすでに OpenTelemetry を出力しているなら、OTEL_EXPORTER_OTLP_ENDPOINT を mcpd に向けることが、統合のすべてです。

SDK があるのは、OTLP にプロンプト、補完、トークン数、スコアを表す語彙がないからです。そして、あなたが求めているのはまさにそのフィールドです。SDK を使うかどうかは選択であって、条件ではありません。6 つとも同じ振る舞いをします。スパンの記録は上限のあるキューに追加して戻るだけで、ネットワークの処理はバックグラウンドのワーカーが行い、計装の経路が例外を投げることはありません。観測している対象を落としかねない可観測性は、何もないよりも悪いものです。

1 つのバイナリ、2 通りのデプロイ

ノート PC で動かすコンテナは、誰かのクラスターで Deployment として動くコンテナと同じものです。保持期間、秘匿化、サンプリング、API キーは、その同じバイナリのフラグであって、別のビルドでも、ライセンスの区分でもありません。手に入らない版にしかない機能はありません。

既定値はノート PC に合わせてあるので、キーを設定しなければ取り込みも読み取りも開いたままです。その状態でループバック以外のアドレスを待ち受けているとき、mcpd は起動時にはっきり警告します。それでも起動はします。拒否すれば、対象としている人の 5 分の道筋を壊してしまうからです。とはいえ、黙っているのは無責任です。

次に読むもの

mcpd は Apache-2.0 ライセンスです。入ってくるプロトコルも、出ていく形式も、その周りのライセンスもすべて開かれているので、離れるのは来るのと同じくらい安く済みます。