概要
エージェントの隣で動かすプロセスであって、エージェントをその周りに組み立てるライブラリではありません。ステップ間の実行を保持し、そのひとつずつを記録します。このページを読めば、全体の形がひととおり分かります。
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
スコアとフィードバックは意図して分けてあります。スコアラーの 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 分の道筋を壊してしまうからです。とはいえ、黙っているのは無責任です。
次に読むもの
- 今すぐ動かす:クイックスタートは自分のエージェントのトレースを画面に出すまでを、インストールは入口をひととおり扱います。
- 用語を覚える:概念はトレース、スパン、種別、相関を定義します。以降のドキュメントはこれを前提にしています。
- ステップ間で実行を保持する:ワークフロー、そのあとにワーカーと実行。
- すでに OpenTelemetry がある:OTLP の経路の全体。標準の属性から mcpd が何を推測するかも含みます。
- 他の人のために動かす:Docker と Kubernetes、そのあとにマスキングと保持。
mcpd は Apache-2.0 ライセンスです。入ってくるプロトコルも、出ていく形式も、その周りのライセンスもすべて開かれているので、離れるのは来るのと同じくらい安く済みます。