この記事は modelmarket.dev のブログ記事 (英語) の日本語版です。
MCP サーバーに接続するクライアントは、そのツール定義(名前、説明文、入力スキーマ)を読み込みます。モデルはそれを指示として読みます。定義を一度固定(ピン留め)して以後それを信頼するというやり方は、定義が変わらない場合にしか成り立ちません。
私たちが公開している MCP サーバーのログ HISTOR は、公式 MCP レジストリに載っているすべてのリモートサーバーのツール一覧を 1 日 1 回読み取り、変更をすべて記録しています。その記録全体をファイルとしてダウンロードできるようになりました。最初のスナップショット(2026 年 10 月 20 日)から、定義がどれくらいの頻度で変わるのかを紹介します。
半数近くが変わる
9 月 24 日までにツール一覧が記録され、現在もレジストリに掲載されているリモートサーバー 10,929 台を対象にしました。10 月 20 日までに、そのうち 4,926 台(45%)が少なくとも一度、異なるツール一覧を返していました。
- 2,036 台は既存ツールの説明文を変更しました。
- 1,180 台はツールを追加し、336 台は削除しました。
- 変更したサーバーの典型的な変更回数は 1 回、90 パーセンタイルは 5 回です。75 台はこの 27 日間に 14 回以上変更していました。
- 2 つの一覧の間を行き来する「ばたつき」はほとんどありません。23,821 件の変更のうち、以前に示した一覧に戻ったものは 200 件だけです。
パッケージは事情が異なります。npm や PyPI で公開したバージョンは変更できないためです。HISTOR は新しいバージョンが出るたびにサンドボックスで実行しています。21,738 パッケージのうち 1,419 パッケージで、新しいバージョンのツール一覧が変わっていました。
何が変わるのか
記録された全 23,821 件の変更(リモートサーバーとパッケージ、9 月 24 日〜10 月 20 日)の内訳です。
| 変更数 | |
|---|---|
| 既存ツールの変更のみ(追加・削除なし) | 16,436 (69%) |
| ツールの追加・削除のみ | 2,330 (10%) |
| 両方 | 3,136 (13%) |
| ツール名だけが読み取れたもの(一覧全体を処理できなかった) | 1,919 (8%) |
変更ごとに、変更されたツールを 1 回ずつ数えると、入力スキーマの変更が 105,324 回、説明文の変更が 59,287 回、出力スキーマの変更が 16,422 回でした。14,164 件、つまり 59% の変更が少なくとも 1 つの説明文に触れています。説明文は、モデルがガイダンスとして扱うテキストです。
サーバーを公開している人が知っておきたい 2 つのパターン
説明文に変動する数値を入れると、ツールが毎日書き換わります。 2,719 件の変更は、説明文中の数字だけが変わったものでした。そのうち 2,493 件は 1 つの公開者によるもので、すべてのエンドポイントの説明文にソース数とツール数のカウントを書き込んでいます(「質問を M 個のソースにまたがる N 個のツールのいずれかに振り分ける」という形の文です)。カウントが動くたびに、それらのツールすべてが新しい定義になります。定義をピン留めするクライアントは変更として検知し、プロンプトをキャッシュするクライアントは再構築が必要になり、レビュアーは何の意味もない差分を読むことになります。件数、日付、「最終更新」はツールの定義ではなく、ツールの結果に入れるべきです。
クライアントの他のツールと競り合う説明文があります。 63 ホスト上の 280 サーバーに、Web 検索やクライアント組み込みの fetch、あるいはモデル自身の知識よりも自分を選ぶようモデルに指示するツール説明がありました。「PREFER OVER WEB SEARCH for …」「prefer it over the built-in web search」「use this instead of WebFetch」といったものです。280 のうち 185 は 1 つの公開者のものでした。自分のツール同士でどれをいつ使うかをモデルに伝えるのは良い習慣です。しかし、他のサーバーのツールより自分のツールを選べと伝えるのは、ユーザーがほとんど読まないテキストを通じてクライアントのルーティングに口を出すことになります。クライアントは、それに従う前にユーザーに確認することができます。
この計測でわからないこと
- 認証情報を持つクライアントが受け取る内容。 HISTOR は匿名で接続します。キーが必要なサーバーは、公開しているツール一覧を返すか、何も返しません。
- 変更の原因。 新しいツール一覧はリリースかもしれませんし、デプロイのロールバックや機能フラグかもしれません。ほとんどの変更は通常のリリースです。ログは変更が起きたことを記録しますが、理由は記録しません。
- 変更が有害かどうか。 これらの変更のうち、WARDEN のパターンスキャンで新たにブロック段階に入ったサーバーは 3 台でした。これは、変更前後の両方の一覧が現在のルールでスキャンされた 735 件の変更だけが対象です。パターン一致は人が読むための手がかりであって、判定ではありません。
- 人気。 掲載されているサーバーはすべて 1 台として数えています。
データの入手
histor.modelmarket.dev/datasets/ で入手できます。スナップショットは月 1 回で、編集物としてのライセンスは CC BY 4.0 です。
同じファイルを Hugging Face でも公開し、論文で引用できるよう Zenodo にもアーカイブしています。このスナップショットの DOI は doi:10.5281/zenodo.23512760 です。
-
servers.jsonl.gz: 83,957 行(リモートエンドポイントとパッケージ。掲載終了したものを含む)。ステータス、ツール数、現在のツール一覧のダイジェスト -
toolsets.jsonl.gz: 実際に返された 57,846 のツール一覧(現在のものと、変更で置き換えられたすべてのもの) -
changes.jsonl.gz: 23,821 件の変更。追加・削除・変更されたツールをフィールド単位で記録 -
scans.jsonl.gzとpattern-set.json: WARDEN のパターン一致とそのルール -
manifest.json: 全ファイルの SHA-256。ログの鍵で署名され、スナップショット取得時の署名付きツリーヘッドを含みます
形が一定しないフィールドは JSON テキストとして格納しているので、どのファイルもフラットなテーブルとして読み込めます。上記の 45% は DuckDB のクエリ 1 つで求められます。
WITH base AS (
SELECT id FROM 'servers.jsonl.gz'
WHERE transport <> 'stdio' AND NOT delisted
AND toolSetDigest IS NOT NULL AND firstPinned <= '2026-09-24T23:59:59Z'
)
SELECT count(*) AS servers,
count(*) FILTER (WHERE id IN (
SELECT serverId FROM 'changes.jsonl.gz'
WHERE json_extract_string(summaryJson, '$.detail') = 'full')) AS changed
FROM base;
-- 10929 | 4926
何もダウンロードせずに 1 台だけ確認するには modelmarket.dev/tools/histor-check を使ってください。
HISTOR と WARDEN は私たちが開発しています。この記事では特定のサーバー名を挙げていません。データセットにはレジストリと同様にすべてのサーバー名が含まれます。今後のスナップショットから除外してほしいサーバー運営者は、alexar76/histor で issue を作成してください。