mcpField
I
Iris

Iris

ローカル
iris-eval.com開発ツール92 日前に更新

Iris について

Irisは、AIエージェントの実行を評価・監視するローカル優先のMCPサーバーです。SQLiteへのトレース保存に加え、編集可能な決定論的ルール、任意のLLM審査、ダッシュボード、HTTP取り込みを備えています。

主な機能

  1. 01階層スパン付きトレース記録
  2. 0226種類の決定論的評価ルール
  3. 03コスト上限付きの任意LLM審査
  4. 04SQLite保存とダッシュボード
  5. 05HTTPによるトレース取り込み
  6. 06CI評価ゲート

活用シーン

  1. 01エージェントの失敗と根拠の確認
  2. 02出力内のPIIやプロンプトインジェクション検出
  3. 03CIでの実行結果の比較
  4. 04モデルのツール呼び出しに依存しないトレース収集

MCP 対応

MCPクライアントはIrisに接続し、ツールやcapabilitiesリソースを使って実行を記録・評価できます。HTTP取り込みや別途のキャプチャ連携を使わない場合、トレースの記録にはエージェントによるIrisツールの呼び出しが必要です。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
npm@iris-eval/mcp-server0.21.0
mcpbiris-eval.mcpb0.21.0

ツール

9

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
agent_namestringはいエージェント名 — get_traces でのフィルタリングに使用します(例:"customer-support-bot")
frameworkstringいいえエージェントのフレームワーク識別子(例:langchain、autogen、custom)
inputstringいいえAgent の入力テキスト — この出力を生成したユーザープロンプトまたは上流の入力
outputstringいいえAgent の出力テキスト — Agent が生成した内容(採点のため evaluate_output に渡します)
tool_callsarrayいいえ実行中に行われたツール呼び出し(呼び出しごとのレイテンシ、エラー、入力/出力)
latency_msnumberいいえ合計実行時間(ミリ秒、エンドツーエンドの Agent レイテンシ)
token_usageobjectいいえトークン使用量の内訳(プロンプト/補完/合計 — コスト分析に使用)
token_usage.prompt_tokensnumberいいえ
token_usage.completion_tokensnumberいいえ
token_usage.total_tokensnumberいいえ
cost_usdnumberいいえUSD での合計コスト — 指定すると span ごとの集計を上書きします(確定値として扱われます)
metadataobjectいいえ不透明なキーと値のタグ(例:{requestId, userId, env})— ダッシュボードでは検索できますが、get_traces のフィルターでは使用できません
spansarrayいいえ詳細な実行 span(タイミング、属性、イベントを含む階層型 span ツリー)
timestampstringいいえTrace のタイムスタンプ(ISO 8601)。省略すると now() が既定値になります

詳細

Iris — 勘ではなく、確かな根拠に基づいてエージェントをリリースしましょう

Glama Score Install in Cursor Install in VS Code npm version GitHub stars CI OpenSSF Scorecard OpenSSF Best Practices License: MIT Docker PulseMCP mcp.so

Iris は、すべてのエージェント実行を品質、安全性、コストの観点からスコアリングします。SDK もアカウントも不要で、すべてお使いのマシン上で行えます。 多くのエージェントプロジェクトでは、いくつかの記憶頼みのプロンプトを実行して出力を目視確認することで、品質をチェックしています。Iris はそれを、監査可能な数値に置き換えます。エージェントの実行結果はディスク上の SQLite データベースに保存され、組み込みの 26 個のルールが、PII、プロンプトインジェクション、ハルシネーションの兆候、コストのしきい値、エージェント自身のツール呼び出しを決定論的にスコアリングします。無料で、LLM の呼び出しもありません。また、評価 1 回あたりのコスト上限を厳格に設定できるオプションの LLM ジャッジが、意味的な判断を要する質問を処理します。すべてのルールは確認・編集できます。監査できないジャッジのスコアは、結局のところ、勘に数字を付けただけだからです。MIT ライセンスで、テレメトリもありません。次のいずれかを有効にしない限り、データがお使いのマシンの外に送信されることはありません。指定したコレクターにトレースをエクスポートする OpenTelemetry エンドポイント(IRIS_OTEL_ENDPOINT)、ご自身のキーを使う LLM ジャッジ(判定対象のテキストをプロバイダーに送信し、引用チェックでは出力が引用するページを取得します)、または ID、判定結果、ルール名のみを設定したアドレスに送信し、テキストは送信しない Webhook です。

Node.js 22.13 以降が必要です。 node --version で確認してください。

デモ:失敗一覧、開いた失敗、2 つの実行結果の比較

デモ用データベースは scripts/demo-media.mts で記録されています。ソースは demo.mp4 です。静止画はこちらです:dashboard-overview.png。

60 秒で失敗を画面に表示

エージェントの配線も設定も不要です。コマンドを 1 つ実行するだけです。

npx @iris-eval/mcp-server --demo

デモ用データベースが作成されます。小規模なエージェントが 5 つ、2 週間分の実行履歴、エンジン自身によるすべての判定が含まれます。ダッシュボードはそのデータを使って http://localhost:6920 で起動します(初回起動時はブラウザーが自動的に開きます)。ダッシュボードは Failures を表示します。失敗した内容が、深刻度の高い順、新しい順に並び、各カードにはルールとその根拠が示されます。詳細もぜひご覧ください。安全性ルールが検出した PII の漏えい、要約エージェントが従ってしまったフォーラム投稿内の隠し指示、ソース文書に記載されていない数値、同じ 12 個の質問に対する 2 回の実行を期間を指定して比較した結果(Runs)、デプロイ済みのカスタムルールと監査行付きで一時停止されたルール、そして評価の根拠を伴う、失敗した LLM ジャッジのスコアが確認できます。

デモデータは専用のデータベース(Iris のホームディレクトリにある demo.db。macOS/Linux では ~/.iris、Windows では %USERPROFILE%\.iris)に保存され、実際のトレースと混ざることはありません。コマンドを 1 つ実行すると、すべて削除できます。

npx @iris-eval/mcp-server --demo-clear

独自のエージェントを接続する

まず、このマシンでインストールが動作することを確認します。オフラインで実行され、あなたのファイルを開くことはありません。

npx @iris-eval/mcp-server --self-test   # exit 0 = healthy

次に、Iris を MCP クライアントに追加します。次のコマンドを実行すると、クライアント独自の設定ファイルに書き込み、ほかのサーバーをすべて保持したまま、実行したバージョンを固定します。

npx -y @iris-eval/mcp-server install claude-code

クライアントは claude-code、claude-desktop、cursor、windsurf、continue、vscode、cline、zed、codex、gemini です。install --list を実行すると、このマシンで見つかったクライアント、それぞれが実行する Iris、読み込むファイルが表示されます。install <client> --uninstall を実行すると、Iris を削除できます。すべてのクライアントでデータベースを共有するため、アップグレード後は install --upgrade を実行してすべてをまとめて更新してください(更新)。クライアントを再起動して読み込みます。

Claude Desktop:ワンクリックでインストール。 0.20.0 以降の各リリースには iris-eval.mcpb が添付されています。これはMCP Bundleです。最新バージョンをダウンロードして開くと、Claude Desktop にインストールダイアログが表示されます。ダイアログの項目はどれも必須ではありません。LLM 評価用の Anthropic または OpenAI のキーは任意で、ダッシュボードは初期状態ではオフの切り替え設定です。バンドルには npm パッケージとその依存関係が含まれているため、ほかにインストールするものはありません。Claude Desktop は、同梱の Node が 22.13 以降であればその Node で実行します(Claude Desktop 1.1.6679 には 24.13 が同梱されています)。Iris は Node 内蔵の SQLite を使ってトレースを保存し、ほかのインストールと同じ ~/.iris を使用します。署名とビルドの証明書を検証する方法は、リリースノートをご覧ください。

Iris はあらゆる MCP クライアントで動作し、対応をうたう各クライアントについて、実際に確認した内容を記載した項目があります。CI の実行ごとに検証済み:Claude Code、Gemini CLI — 実際のクライアントがインストーラーの書き込んだ設定から Iris を起動し、接続を報告します(claude mcp list、gemini mcp list)。Linux、macOS、Windows で確認しています。Claude Code のキャプチャープラグインのフックも、実際のスクリプトを通じて実行されます。各クライアント独自の MCP ドキュメントに基づく記載 — インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その形式に沿って書き込む処理をテストしていますが、Iris 側では接続を確認していません:Claude Desktop、Cursor、Devin Desktop(Windsurf)、Continue、VS Code、Cline、Zed、OpenAI Codex CLI。各項目の情報源と確認日はこちらをご覧ください:https://iris-eval.com/clients。手動で設定する場合は、ダッシュボードも含めて次のブロックを使います。

{
  "mcpServers": {
    "iris-eval": {
      "command": "npx",
      "args": ["-y", "@iris-eval/mcp-server", "--dashboard"]
    }
  }
}

接続すると、クライアントに Iris の 12 個のツールが表示され、ダッシュボードは http://localhost:6920 で利用できます。次の内容をエージェントに入力してください。

Iris に直前のタスクを記録し、出力を評価してください。

トレースはスコアとともにダッシュボードに表示されます。MCP サーバーをヘッドレスで使いたい場合は、引数から --dashboard を削除してください。同じダッシュボードは、いつでも npx @iris-eval/mcp-server --dashboard で開けます。

事前に知っておきたいことが一つあります。 MCP ツールを呼び出すかどうかは、モデルが判断します。Iris はエージェントを傍受しないため、エージェントが記録を依頼したときにトレースが記録されます。これは、あなたが依頼した場合、またはコードがツールを直接呼び出した場合です。エージェントに「これを Iris に記録して評価して」と頼めば、記録されます。モデルの選択に左右されないキャプチャーが必要な場合は、POST /api/v1/traces を利用できます。モデルを介さず、コードからプレーンな HTTP でトレースを送信できます(docs/http-ingest.mdを参照)。ロードマップにある CLI とホストフックは、同じエンドポイントを利用する軽量なクライアントになります。

HTTP 経由で記録する(モデルを介さない)

取り込みエンドポイントはダッシュボードのポート(デフォルトでは 6920)で動作します。MCP トランスポートのポートではありません。また、ダッシュボードの実行中のみ利用できます。--dashboard を渡すか、IRIS_DASHBOARD=true を設定してください。--transport http だけでは起動せず、トランスポートのポートにリクエストを送ると 404 が返ります。ダッシュボードが起動していれば、HTTP リクエストを送信できるものなら何でもトレースを記録でき、必要に応じて同じリクエスト内で決定論的な評価も実行できます。同じポートの GET /api/v1/capabilities は、このサーバーが評価できる内容、各ルールに必要なもの、評価を有効にする手順を含む評価の状態、制限を示します。これは MCP リソース iris://capabilities が提供するものと同じオブジェクトで、HTTP の呼び出し元も MCP クライアントが初期化時に受け取る情報を得られます。

curl -s -X POST "http://127.0.0.1:6920/api/v1/traces" \
  -H "Content-Type: application/json" \
  -d '{
    "agent_name": "support-bot",
    "input": "What is the refund policy?",
    "output": "Refunds are available within 30 days of purchase.",
    "evaluate": true,
    "eval_type": "safety"
  }'

保存された trace_id と評価結果を含む 201 を返します(--demo モードでは、このエンドポイントは書き込みを 403 で拒否するため、デモデータがユーザーのデータと混ざることはありません)。このエンドポイントは log_trace ツールと同じ本文を受け付け、ダッシュボードの他の機能と同じミドルウェアスタックを通ります。デフォルトではループバックへのバインドと DNS リバインディング対策が適用され、設定した場合は Bearer 認証も適用されます。明確な事実が 2 つあります。 Iris を --api-key(または IRIS_API_KEY)付きで起動しない限り、認証なしで書き込みを受け付けます。デフォルトではループバックへのバインドによって自分のマシンからのアクセスに制限されるため、ループバック以外にバインドする前にキーを設定してください。また、保存される内容はそのままです。input と output は、no_pii が検出するテキストも含め、送信された内容のまま iris.db に保存されます。仕様、フィールドのリファレンス、エラーの詳細については、docs/http-ingest.md を参照してください。

Claude Code のすべてのターンを記録する(オプション)
/plugin marketplace add iris-eval/mcp-server
/plugin install iris-eval-capture@iris-eval

別途インストールする 2 つ目のプラグインです。フックによって、プロンプトをキーとして各ターンのプロンプト、ツール呼び出し(失敗したものも含み、エージェントが受け取ったエラーも記録します)、最終回答を記録します。これにより、中断されたターンの呼び出しやバックグラウンドのサブエージェントの呼び出しも送信されます。記録した内容は、保存される評価テキスト内の重要なスパンを編集したうえで、切り離されたプロセスとして iris-eval ingest に渡されます。これは、モデルがツールを呼び出すと判断するかどうかに依存しない記録方法です。API エラーで終了したターンは評価せずに保存されます。モデルもそのターンを記録していた場合は両方のトレースが保持され、プラグインのトレースにはモデルのトレース名が付けられます。プラグインが何かを表示したり、処理をブロックしたり、どこかに送信したりすることはありません。iris-eval をインストールしただけでは、ターンのループに何も変更はありません。制限と削除方法については、claude-plugin-capture/README.md を参照してください。

Python
pip install iris-eval
from iris_eval import IrisClient
iris = IrisClient()                       # IRIS_URL, or the running dashboard's runtime.json
iris.evaluate_output("…", input="…", agent_name="support-bot")["verdict"]   # {"state": "pass", "basis": "clean", "by": []}

サーバー 0.16.0 以降の HTTP API を利用する軽量なクライアントです。バージョンはサーバーとは別に管理され、iris_eval.__version__ と PyPI のページに記載されます。サーバーのバージョンとは異なります。log_trace()、evaluate_output()、get_traces()、get_trace()、health()、capabilities() に、同期・非同期の両方、型付きの回答、拒否時にサーバー自身が返す文言を備えています。また、iris フィクスチャと、判定結果の状態をアサートする assert_iris(output, expect="pass") を提供する pytest プラグインもあります。packages/python/README.md を参照してください。

OpenAI と Anthropic のすべての呼び出しを記録する
from iris_eval import wrap_openai
client = wrap_openai(OpenAI(), agent_name="support-bot")   # every call: a GenAI span to POST /v1/traces, scored
import { wrapOpenAI } from '@iris-eval/sdk';
const openai = wrapOpenAI(new OpenAI(), { agentName: 'support-bot' });

プロバイダークライアントを一度ラップすれば、モデル呼び出しごとに OpenTelemetry GenAI スパンが 1 つ作成され、OTLP の入口に送信されます。入力、出力、トークン使用量、ツール呼び出しとともに保存され、評価されます。モデルがツールを呼び出すかどうかに依存しないキャプチャです。Python クライアントでは wrap_openai / wrap_anthropic、@iris-eval/sdk では Vercel AI SDK 用の wrapOpenAI、wrapAnthropic、irisMiddleware を使用します。どちらもまだ公開されていません(PyPI の次回 iris-eval リリースで公開予定です。@iris-eval/sdk は最初の npm リリースまでソースからビルドします)。ストリーム、SDK のストリームヘルパー、ツール呼び出しに対応しています。元のクライアントは変更されず、Iris が停止しても呼び出しに影響しません — packages/sdk/README.md、packages/python/README.md。

LangChain と LangGraph のすべての実行を評価する
from iris_eval.langchain import IrisCallbackHandler
graph.invoke(inputs, config={"callbacks": [IrisCallbackHandler(agent_name="support-bot")]})

トップレベルの実行ごとにトレースが 1 つ作成されます(実行、そのモデル呼び出し、ツール呼び出し、グラフノードは GenAI スパンとして記録されます)。入力、出力、ツール呼び出し、トークン使用量、判定が含まれます。Python ではクライアント内で利用できます(pip install iris-eval、0.2.0 以降)。JavaScript では @iris-eval/langchain として利用できます(このリポジトリにありますが、npm にはまだ公開されていません)。どちらも、スクリプト化されたモデルを使う実際の LangGraph アプリで CI により検証済みです。LangSmith 独自の OpenTelemetry エクスポートも同じ方法で検証済みです — docs/otel-recipes.md。

サーバー不要の CI ゲート
npx -y @iris-eval/mcp-server ingest --file traces.ndjson --evaluate --fail-on any

any を指定すると、合格以外のすべての判定でジョブが失敗します。失敗判定と、チェックされなかった判定の両方が対象です。特定のものだけを対象にするには、代わりに --fail-on detector_veto のように 1 つの基準を指定します。

または、ジョブサマリーにレシートを書き込み、プルリクエストのコメントとして投稿する GitHub Action(0.16.0)を使用できます。コメントはその場で更新されます。traces: traces.ndjson とともに uses: iris-eval/mcp-server/.github/actions/[email protected] を指定します — docs/ci-gate.md。

4 つ目の入口(0.15.0)として、ダッシュボードのポートにある POST /v1/traces は、既存の OpenTelemetry インストルメンテーションが出力する OTLP/HTTP の JSON または protobuf を受け付けます(Python SDK のエクスポーターは protobuf のみを扱うため、これが Python 用の入口でもあります)。各 OTLP トレースは、スパンを含む Iris トレースになります — docs/otel-integration.md。フレームワークごとのレシピ(Pydantic AI、Google ADK、LangSmith 経由の LangGraph、CrewAI、Python と JavaScript の OpenAI Agents SDK、LlamaIndex、AutoGen、Microsoft Agent Framework、Semantic Kernel、Vercel AI SDK、Mastra)は、それぞれフィクスチャで検証済みです。docs/otel-recipes.md をご覧ください。ingest は標準入力またはファイルから JSON トレース 1 件(または 1 行につき 1 件の NDJSON)を読み込み、保存したうえで、evaluate_output が実行するものとまったく同じルールで評価します。判定とその基準を含む JSON 行をトレースごとに 1 行出力し、判定が --fail-on に一致すると終了コード 1 で終了します。--dataset <id|label> を指定すると、ゲートの対象をデータセット内のケースキーに絞れます(POST /api/v1/datasets により、実行のケースキーをデータセットに登録できます)。これにより、選択したケースだけでジョブが失敗します。手順の全容、終了コード、8 つの基準については docs/ci-gate.md をご覧ください。

ルールをコードとして記述する

config.json の eval.plugins には、作成したルールを読み込めます。これは { name, kind, mechanism, version, needs, evaluate(ctx) } をデフォルトエクスポートする ES モジュールです。ファイルの sha256 を固定するため、固定後にファイルが変更されると、実行されるのではなく起動が拒否されます。読み込まれたプラグインは組み込みルールと同様に動作し、list_rules の plugins に表示されます。契約、ハッシュの算出方法、プラグインが返せる値については、docs/plugins.md をご覧ください。

独自のプロセスでエンジンを使う

評価エンジンはインポート可能です。サーバーもデータベースもモデルも必要ありません。

import { EvalEngine, defaultConfig } from '@iris-eval/mcp-server/engine';

const engine = new EvalEngine(defaultConfig.eval.defaultThreshold, defaultConfig.eval.ruleThresholds, defaultConfig.eval);
const result = await engine.evaluateAll({ output: answer, input: prompt, toolCalls, costUsd });
result.verdict.state;       // 'pass' | 'fail' | 'unknown', with result.verdict.basis and result.interpretations

サーバーが実行するものと同じエンジン、同じルール、同じコンポーザーを使えます。builtInRules()、createCustomRule()、compose() と、公開済みの精度を読み取る関数もあわせてエクスポートされています。

HTTP ルート用の型付きクライアント
import { createClient } from '@iris-eval/mcp-server/client';

const iris = createClient({ baseUrl: 'http://127.0.0.1:6920', apiKey: process.env.IRIS_API_KEY });
const { trace_id, evaluation } = await iris.logTrace({ agent_name: 'support-bot', input, output, tool_calls, evaluate: true });
evaluation?.verdict?.state;  // the same object evaluate_output returns

どの窓口でもリクエストボディは共通です。log_trace と iris-eval ingest が受け付ける形式です。リクエストが拒否されると、サーバー独自のメッセージとステータスを含む IrisClientError がスローされます。両方のサブパスは、ビルドのたびにパッケージ化された tarball から検証されます。

インストールの確認
npx @iris-eval/mcp-server --self-test   # offline diagnostic; exit 0 = healthy, 1 = a check failed
npx @iris-eval/mcp-server --version     # prints the bare version, e.g. 1.2.3

--self-test は、まず Iris のホームがない場合は作成し、書き込み可能か確認します(書き込みできない場合は、パスを示して終了コード 1 を返します)。データベースの検索インデックスの状態(完成済み、バックグラウンドでの構築によりこれまでにインデックス化されたトレース数、またはこの SQLite に FTS5 がないこと)を報告し、データベースのスキーマを読み取ります(このバージョン、または古いリリースに固定された MCP クライアントで開けない場合は、修正方法を示して終了コード 1 を返します)。その後、分離された一時ホーム内で、ストレージのラウンドトリップ、セーフティルールによる仕込み済みの SSN とインジェクションの検出、ダッシュボードの起動、DNS リバインディングガードをチェックします。実際のデータベースは読み取りのみで、変更されることはありません。Iris が書き込むデータはすべて、1 つのディレクトリ、Iris ホームに保存されます。デフォルトは ~/.iris(Windows では %USERPROFILE%\.iris)ですが、IRIS_HOME で指定した場所にも設定できます。iris.db、config.json、custom-rules.json、audit.log、preferences.json、デモファイルはここに保存されます。IRIS_HOME を作業用ディレクトリに設定すれば、実際のデータに触れずに Iris を試せます。

ツール別のセットアップ
クライアント状態内容参照先
Claude Code検証済みCI の実行ごとに、テストで実際のクライアントを操作します2026-09-25
Claude Desktop対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
Cursor対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
Devin Desktop (Windsurf)対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
Continue対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
VS Code対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
Cline対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
Zed対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
OpenAI Codex CLI対応を申告インストーラーはクライアントのドキュメントに記載された形式で設定を書き込み、その書き込み処理はその形式に対してテストされています。Iris 側で接続を確認した人はいません2026-09-25
Gemini CLI検証済みCI の実行ごとに、テストで実際のクライアントを操作します2026-09-25

確認内容を含む各行はこちらです:iris-eval.com/clients。行がないクライアントを対応済みとは呼びません。

npx -y @iris-eval/mcp-server install <client> を実行すると、これらの設定が書き込まれます。クライアントごとに手動で設定する場合:

Claude Desktop

MCP 設定ファイルを編集します:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

上記の JSON 設定を追加してから、Claude Desktop を再起動します。

Claude Code
claude mcp add --transport stdio iris-eval -- npx -y @iris-eval/mcp-server

ツールを読み込むには、セッションを再起動します(/clear を実行するか、再起動してください)。

Windows に関する注意: cmd /c のラッパーは使用しないでください。パスの解析で問題が発生します。npx コマンドはそのまま実行できます。

Cursor

上記の JSON 設定を、~/.cursor/mcp.json(すべてのプロジェクトに適用)またはワークスペース内の .cursor/mcp.json に追加します。iris-eval のエントリーには "type": "stdio" を指定してください。Cursor のドキュメントでは必須とされています。

Devin Desktop (Windsurf)

上記の JSON 設定を mcp_config.json に追加します。macOS と Linux では ~/.config/devin/mcp_config.json、Windows では %APPDATA%\devin\mcp_config.json です。

Continue

上記の JSON 設定を個別のファイルとして、Continue の mcpServers フォルダーに保存します。~/.continue/mcpServers/iris-eval.json(すべてのワークスペースに適用)または任意のワークスペース内の .continue/mcpServers/iris-eval.json を指定します。

VS Code (native MCP)

ワークスペース内の .vscode/mcp.json に追加します(注:VS Code では mcpServers ではなく servers を使用します)。

{
  "servers": {
    "iris-eval": {
      "command": "npx",
      "args": ["-y", "@iris-eval/mcp-server"]
    }
  }
}
Cline

Cline の MCP Servers パネルを開き、Configure MCP Servers を選択して、上記の mcpServers JSON 設定を cline_mcp_settings.json に追加します(~/.cline/data/settings/cline_mcp_settings.json。VS Code、JetBrains、CLI の Cline で共有されます)。

Zed

Zed の settings.json に追加します。

{
  "context_servers": {
    "iris-eval": {
      "command": "npx",
      "args": ["-y", "@iris-eval/mcp-server"],
      "env": {}
    }
  }
}
OpenAI Codex CLI

~/.codex/config.toml に追加します。

[mcp_servers.iris-eval]
command = "npx"
args = ["-y", "@iris-eval/mcp-server"]
Gemini CLI

上記の mcpServers JSON 設定を ~/.gemini/settings.json に追加します。Gemini CLI は、信頼済みのフォルダー内でのみ MCP サーバーに接続します。gemini mcp list で iris-eval が Disabled と表示された場合は、そのフォルダー内で /permissions を実行してください。

MCP に対応するその他のクライアント

Iris は標準的な stdio MCP サーバーです。必要なのは npx @iris-eval/mcp-server コマンドだけで、SDK もコード変更も不要です。MCP に対応するクライアントであれば、Iris にも対応しています。クライアントの設定形式は変更されることがあるため、迷った場合はクライアントの MCP ドキュメントを確認し、そのコマンドを指定してください。

その他のインストール方法
# Global install (recommended for persistent data and faster startup)
npm install -g @iris-eval/mcp-server
iris-eval --dashboard

# Docker — two servers, two ports: 3000 = MCP HTTP transport,
# 6920 = dashboard (which also serves the POST /api/v1/traces ingest endpoint).
# The image binds 0.0.0.0 inside the container, so a key is required (see Production).
# The volume is the Iris home: the database, deployed rules and audit log persist in it.
docker run -p 3000:3000 -p 6920:6920 -v iris-data:/data \
  -e IRIS_API_KEY="$(openssl rand -hex 32)" ghcr.io/iris-eval/mcp-server

ヒント: グローバルインストール(npm install -g)では、トレースが ~/.iris/iris.db に永続的に保存されます。npx の場合も同じ場所にトレースが保存されますが、パッケージの解決に時間がかかるため、起動が遅くなります。

得られる機能

トレースログツール呼び出しごとのレイテンシ、トークン使用量、USD 建てのコストを記録した階層型スパンツリーです。SQLite に保存され、即座にクエリできます。
出力評価4 カテゴリーにわたる 26 個の組み込みルール:完全性、関連性、安全性、コスト。PII 検出(21 パターン:SSN、クレジットカード、電話番号、メール、IBAN、生年月日、MRN、IP、API キー、パスポート、AWS/Slack/SendGrid/GitHub/Google/npm/DigitalOcean のトークン、URL 内の認証情報、シークレット名を含む代入、PEM 秘密鍵ブロック、シードフレーズ。生年月日、医療記録番号、パスポート、シードフレーズは、ラベルの隣にある場合にのみ検出されます。設計上の仕様)、プロンプトインジェクション(38 パターン、フレーズおよび構造)、スタブ出力検出、ハルシネーション検出(コンテキストに基づく捏造・矛盾の兆候を 25 件検出します。エージェントのソース資料に照らして評価するには、input を渡してください)、そしてエージェントが実際に行ったことを読み取る 6 つの軌跡ルールです:認識されなかった失敗したツール呼び出し、繰り返されたツール呼び出し(呼び出し単位、シーケンスの繰り返し、または tools を送信した場合は対象単位)、ツール自身の JSON Schema が引数を拒否し、エージェントが再試行しなかった呼び出し、エージェントが読み取った内容のどこにも現れないのに回答で引用されたファイル、ディレクトリ、URL、TOOL RESULT 内に含まれていた指示に後続の呼び出しで従ったケース、そしてステップ予算を超える数のツール呼び出しを要したタスクです。軌跡は tool_calls または OpenTelemetry の TOOL スパンとして渡せます。Zod スキーマを使ってカスタムルールを追加できます。
LLM による評価Anthropic または OpenAI を使った任意の意味的スコアリングです。API キーはご自身で用意してください。7 つのテンプレートが用意されています。IRIS_RELEVANCE_JUDGE_MODEL を設定すると、answers_the_ask は relevance ジャッジに問い合わせ、的外れな回答を不合格にします。設定しない場合、ルールは質問を語彙的に評価し、助言を返します。評価ごとの厳格なコスト上限(IRIS_LLM_JUDGE_MAX_COST_USD_PER_EVAL、デフォルトは $0.25)を設定でき、評価ごとの料金は結果に表示されます。
コストの可視化任意の期間における全エージェントのコストを集計できます。予算のしきい値を設定すると、エージェントが予算を超過した際に通知されます。トークン数とモデルを送信してもコストを送信しないトレース(OpenTelemetry およびフレームワークのトレースの大半)は、モデルの定価に基づいて価格が算出され、表示されるすべての箇所で推定値として示されます。組み込みテーブルにないモデルの価格は、config.json の pricing.models で設定できます。— docs/cost.md。
Web ダッシュボードリアルタイムのダークモード UI で、失敗したトレースが最初に、最悪のものから新しいものの順に表示されます。すべてのトレースのテキストを対象にした全文検索、評価結果、コストの内訳を備えたトレースの可視化機能と、独自のルール、トレース、評価を検索できるコマンドパレット(⌘K)を利用できます。
ローカルファーストすべてのデータはローカルディスク上の SQLite に保存されます。セルフホスト可能なサーバーはアカウントや登録が不要で、テレメトリーも送信しません。外部への HTTP 通信は、ユーザーがオプトインした場合に限られます:ご自身の LLM ジャッジ用キー、引用の取得、設定した OTel エクスポーター、または設定した Webhook です。

今後の展開についてはこちらをご覧ください:機能マップ — Iris があらゆる対象について尋ねられる質問、それぞれに対応できることと、できないこと — および3 つのトラック。

主張ではなく、測定結果です

組み込みルールごとに、95%信頼区間付きの適合率、再現率、F1スコアを公開しています。測定には、このリポジトリ内にあるラベル付きコーパス(proof/corpus/)を使い、キーもモデルも使わずにオフラインで、1つのコマンド — npm run proof — を実行して再生成できます。これらの数値は2種類に分かれており、このページでは決して合算しません。一部のルールは、モデルが失敗自体を読み取って付けたラベルを基準に測定しており、これは検出能力を測るものです。残りのルールは、文書化された独自の定義に基づいて独立に検証され、コードがその計算式を実装していることを示しますが、その計算式が失敗を検出できるかどうかは示しません。proof/RESULTS.md と証明ページでは、各ルールに印を付けています。CI はすべてのプルリクエストで測定を再実行し、コミット済みの数値がコードの生成結果と異なる場合は失敗します。そのため、ルールを変更すれば数値も必ず変わります。数値は iris-eval.com/proof と proof/RESULTS.md に掲載されています。コーパスの作成方法、コーパスに含まれないもの、信頼区間の読み方については、docs/proof.md をご覧ください。コーパスは合成データで、モデルによるラベル付けが行われています — 人間によるブラインドラベル付けは保留中であり、そのことはページにも記載されています。node proof/blind-sample.mjs を実行すると、結論を出すための再現可能なサンプルを抽出できます。

MCP ツール

Iris は、MCP 互換エージェントが呼び出せる12個のツールを登録します — トレースとルールのライフサイクル管理、実行間の比較、LLM-as-judge、意味に基づく引用検証に対応しています。

  • log_trace — スパン、ツール呼び出し、トークン使用量、コストを含むエージェントの実行を記録します。同じ呼び出しでスコアを付けるには evaluate: true を指定します
  • evaluate_output — 完全性、関連性、安全性、コストのルールに照らして出力品質を採点します(ヒューリスティック、決定論的、無料)
  • get_traces — フィルタリング、ページネーション、時間範囲の指定に対応して、保存済みのトレースを検索します。また、q を指定すると、エージェントがある内容を発言した実行を探せます。入力、出力、ツール呼び出しの値、メタデータを対象にした全文検索で、関連度順に並べ、該当語をマークします
  • list_rules — デプロイ済みのカスタム評価ルールを一覧表示します(読み取り専用)
  • deploy_rule — 新しいカスタム評価ルールを登録し、そのカテゴリの evaluate_output が呼び出されるたびに適用されるようにします
  • delete_rule — デプロイ済みのカスタムルールを削除します(破壊的操作、冪等)
  • delete_trace — ID を指定して、保存済みのトレースを1件削除します(破壊的操作、テナントの範囲内)
  • evaluate_with_llm_judge — LLM(Anthropic または OpenAI)による意味的評価です。7つのテンプレートに対応します:accuracy、helpfulness、safety、correctness、faithfulness、task_completed、relevance。コストに上限を設け、評価ごとの料金を開示します。API キーはご自身で用意してください(IRIS_ANTHROPIC_API_KEY または IRIS_OPENAI_API_KEY)— Iris は LLM 呼び出しをプロキシしたり中継したりしません
  • verify_citations — 出力から引用(番号付き、著者名と年、URL、DOI)を抽出し、SSRF 対策とドメイン許可リストを備えたリゾルバーで出典を取得してから、LLM judge を使って各出典が引用された主張を実際に裏付けているかを確認します。外部への HTTP 通信はオプトインです。evaluate_with_llm_judge と同じ BYOK 要件があります
  • compare_runs — 変更によってエージェントの性能が低下したかを確認します。保存済み評価の2つの実行を比較し、実行間でケースキーが共通する場合は対応のある厳密検定を行い、それ以外の場合は差の信頼区間を示します。また、必要なケース数を示したうえで、正直に「判断できません」と回答するか、「許容幅の範囲内で同等」と判定します。各ルールには独自の片側検定があり、20個のルールで回帰を誤って検出しないよう、まとめて補正します(Benjamini–Hochberg)
  • compare_traces — エージェントが同じ質問にどれだけ安定して回答するかを確認します。ケースごとの合格率と信頼区間を示し、不安定なケースを先に表示します。全体の合格率には繰り返しの回数を反映します
  • evaluate_runs — 実行内のすべてのトレースを現在のルールで再採点し、新しい実行として記録します。これにより、ルールの変更をエージェントの変更と取り違えません LLM ジャッジを有効にする(任意。決定論的ルールでは不要です)
  1. Anthropic または OpenAI から API キーを取得します。
  2. シェルだけでなく、Iris を実行するプロセスの環境変数に設定します。Claude Code、Claude Desktop、Cursor およびほとんどの MCP クライアントでは、MCP 設定内の iris-eval エントリにある「env」ブロックに設定します — 「iris-eval」: { 「command」: 「npx」, 「args」: [「-y」, 「@iris-eval/mcp-server」], 「env」: { 「IRIS_ANTHROPIC_API_KEY」: 「sk-ant-...」 } }(OpenAI のキーの場合は IRIS_OPENAI_API_KEY)。Docker では、実行コマンドに -e IRIS_ANTHROPIC_API_KEY=... を指定します。HTTP または CI では、iris-eval の起動前に環境変数を設定します。
  3. MCP セッションを再起動します。実行中のプロセスは、起動後に設定された変数を認識しません。
  4. クライアント内から確認します。iris://capabilities を読み取り、judge.enabled が true になっていることを確認します。シェルで設定したキーは、クライアントが起動するプロセスには、クライアントの設定に記載されていない限り渡されません。マシン上で npx @iris-eval/mcp-server --self-test を実行すると、そのシェルのジャッジ行が表示されます。また、稼働中のダッシュボードで GET /api/v1/health を実行すると judge.enabled が報告されます。
  5. 利用額の制限:各呼び出しの上限は IRIS_LLM_JUDGE_MAX_COST_USD_PER_EVAL(デフォルトは 0.25 USD)で、最悪の場合にこの額を超える場合は、費用が発生する前に拒否されます。Iris がキーを使って行うすべてのジャッジ呼び出しは、1 日あたりの共通予算 IRIS_LLM_JUDGE_DAILY_BUDGET_USD(デフォルトは UTC 日あたり 1 USD)を消費します。上限に達すると、UTC の午前 0 時まで呼び出しは行われません。Iris はキーを使ってプロバイダーに直接接続し、キーをプロキシ経由で送信することはありません。
  6. 任意:IRIS_RELEVANCE_JUDGE_MODEL に価格設定済みのモデル ID(例:claude-haiku-4-5)を設定すると、answers_the_ask がジャッジに各回答が要求に応えているかを判定させ、話題から外れた回答を失敗とします。入力を含む評価ごとにジャッジを 1 回呼び出します。この呼び出しではキーが使われ、上記の上限が適用されます。キーを設定しただけでは有効になりません。呼び出しごとに、その入力と出力をモデルのプロバイダーに送信します。その際、個人データと認証情報の no_pii フラグは、先に置き換えられます(IRIS_RELEVANCE_JUDGE_REDACT=off を設定すると、そのまま送信されます)。この呼び出しも 1 日あたりの予算を消費し、リクエストごとの呼び出し回数は IRIS_RELEVANCE_JUDGE_MAX_CALLS_PER_REQUEST(デフォルトは 20)までです。いずれかの上限に達すると、answers_the_ask は語句に基づいて要求を読み取り、その理由を説明します。

IRIS_OTEL_ENDPOINT が設定されている場合、log_trace の呼び出しでは、任意の OpenTelemetry コレクター(Jaeger、Grafana Tempo、Datadog OTLP、Honeycomb など)に対して、ベストエフォートで OTLP/HTTP JSON エクスポートも行われます。docs/otel-integration.md を参照してください。

passed の判定方法

evaluate_output は score と passed フラグの両方を返しますが、それぞれ異なる問いに答えます。

  • score(0~1)は、実行されたルールの加重平均であり、品質の度合いを示します。
  • passed は、リリース可否の判定であり、スコアが判定に使われることはありません。コンポーザーは、ルールがどのような主張をしているかに基づいて各ルールを読み取ります。設定したポリシーはゲートとして機能し、クリティカルな検出器は拒否し、実行を求められたものの回答できなかったクリティカルなチェックは、問題なしではなく判定を unknown(passed: false)にします。それ以外の検出器は、出力に問題がある確率として統合され、eval.falsePassCost(デフォルトは 1、つまりしきい値は 0.5)で指定した損失比と比較されます。verdict.basis は判定を下したレイヤーを、verdict.by は該当するルールを示し、verdict.also には、それ以降のレイヤーのうち、同じ判定を下したものがすべて列挙されます。interpretations[] には、失敗したルールが判定に影響しなかった理由と、その判定を変える設定が示されます。また、判定されなかった質問と、判定できるようにするための入力も示されます。

実際の安全性違反は必ず不合格になります。デフォルトでは、no_pii、no_injection_patterns、no_blocklist_words は クリティカルルール です。いずれかが失敗すると、他のルールのスコアがどれほど高くても、評価結果は passed: false となり、応答の critical_failures に該当するルールが示されます。SSN の漏えいが平均化されて見逃されることはありません。どの組み込みルールをクリティカルにするかはデプロイ設定(eval.criticalRules / eval.nonCriticalRules)で指定します。すべてのルール結果には、有効な critical フラグと criticalSource が含まれ、list_rules には、このサーバーで適用されるルール一覧が表示されます。severity: "high" または "critical" でデプロイされたカスタムルールも同様に必ず不合格となり、low / medium の重大度はスコアにのみ影響します。すべての画面で同じように示される注意点が 1 つあります。コンテキスト不足、定義の破損、サンドボックスの予算上限による正規表現の停止などで、クリティカルルールが スキップ された場合、そのルールは出力を判定していないため、拒否にはなりません。そのようなルールはすべて critical_skipped に列挙されます。フェイルクローズ必須のゲートでは、空でない critical_skipped は問題なしではなく unknown として扱い、rule_results の budgetExceeded によるスキップも同様に扱うことがあります。

CI ゲートでは、eval_type を省略すると、完全性、関連性、安全性、コスト、およびカスタムルールを含むすべてのバンドルが実行されます。応答には、デフォルトで実行されたことを示す note と、バンドルごとの categories マップを伴って、eval_type: "all" が示されます。各行には state(そのバンドルに含まれるルールを対象に読み取った判定)が含まれるため、ある行に、その評価を失敗させたルールの判定が読み込まれることはありません。判定対象がないバンドル(cost_usd がないコスト評価や、input がない関連性評価など)では、その部分の state: "unknown" と passed: null が返されます。これは未評価であって失敗ではなく、判定にも加算されません。応答には、実行された eval_type が常に返されるため、ゲートで対象範囲を検証できます。判定には passed を基準とし、より限定的な評価を実行したい場合にのみバンドル名を指定してください。

カスタムルールの作成

ルールを追加する方法は2つあります。インラインルールは、1回の evaluate_output 呼び出しに付随します(custom_rules、1回の呼び出しにつき最大10件)。選択した eval_type のルールセットとともに実行することも、eval_type: "custom" で単独実行することもできます。デプロイ済みルールは deploy_rule で一度登録すると、Iris のホームディレクトリにある custom-rules.json に保存され、以降のすべての evaluate_output で、該当する evalType のルールとして実行されます。どちらの方法でも、定義の形式は同じです。

フィールド必須内容
nameはい1~80文字。結果では ruleName として表示されます
typeはいregex_match · regex_no_match · min_length · max_length · contains_keywords · excludes_keywords · json_schema · cost_threshold のいずれか
configはいそのタイプに必要なキーです。2種類の正規表現タイプでは pattern(および任意の flags) · 文字数では min_length / max_length · 2種類のキーワードタイプでは keywords(および任意の threshold、0~1。既定値の 1 はすべてのキーワードが必要) · json_schema では {} · cost_threshold では USD 単位の max_cost
weightいいえスコアにおける重み。既定値は 1 です

deploy_rule は、定義を name、任意の description、evalType(completeness · relevance · safety · cost · custom)および severity でラップします。Severity は失敗の意味を示します。low / medium ではスコアのみが下がり、high / critical では加重スコアにかかわらず評価が不合格になります(passed: false、ルールは critical_failures に記録されます)。スキップされたルール(cost_usd がない cost_threshold ルール、または100 msのサンドボックス実行時間上限に達した正規表現)は出力を判定していないため、代わりに critical_skipped に記録されます。エージェントが発言する内容に内部ホスト名が含まれることを禁止する重大度 critical のルールをデプロイします。

{
  "name": "no_internal_hostnames",
  "description": "Output must not mention internal hostnames.",
  "evalType": "safety",
  "severity": "critical",
  "definition": {
    "name": "no_internal_hostnames",
    "type": "regex_no_match",
    "config": { "pattern": "\\b[a-z0-9-]+\\.internal\\.example\\b", "flags": "i" }
  }
}

応答は保存されたルールです。delete_rule で使うために id を控えておいてください。

{ "rule": { "id": "rule-588823d0", "name": "no_internal_hostnames", "evalType": "safety", "severity": "critical", "enabled": true, "version": 1, "definition": { "…": "…" } } }

次回の evaluate_output で eval_type: "safety" を指定すると、db-primary.internal.example に言及した出力は passed: false と critical_failures: ["no_internal_hostnames"] を返します。組み込みの安全性ルール5件がすべて合格し、加重スコアが0.895であっても同様です。正規表現パターンはデプロイ時に ReDoS チェックに合格する必要があり、常にサンドボックスワーカーで100 msの厳格な期限内に実行されます。list_rules ではデプロイ済みルールを確認できます。ダッシュボードのルール作成ツールでは、クリックした失敗から同じ形式のルールを作成できます。仕様の全文、タイプごとのスコアリング、実例については、docs/custom-rules.md をご覧ください。

ツールスキーマと設定の詳細については、iris-eval.com をご覧ください。

セルフホスト可能で無料

Iris は、ご自身のマシンまたはインフラストラクチャで実行できます。オープンソースのコアは無料で、MIT ライセンスのもとで提供されており、使用制限もアカウントもありません。ホスト型ストレージ、チームで共有する履歴、アラート機能は検討中ですが、開発には着手していません。こうした機能が役立つ場合は、[email protected] までお知らせください。

次の2つを約束します。現在無料の機能を、今後有料化することはありません。また、コンプライアンス認証は取得するまで取得済みと主張しません。

例

コミュニティ

設定とセキュリティ ### CLI 引数
フラグデフォルト説明
--transportstdioトランスポートの種類:stdio または http
--port3000HTTP トランスポートのポート
--db-path~/.iris/iris.dbSQLite データベースのパス
--config~/.iris/config.json設定ファイルのパス
--api-key—HTTP 認証用の API キー(トランスポートとダッシュボード。POST /api/v1/traces を含む)
--dashboardfalseWeb ダッシュボードを有効にします。また、POST /api/v1/traces 取り込みエンドポイントを起動する唯一の方法です。--transport http では暗黙的に起動しません
--dashboard-port6920ダッシュボードのポート
--dashboard-host127.0.0.1ダッシュボードのバインドアドレス。デフォルトではループバックです。--api-key を設定しない限りダッシュボードは認証されないため、ループバック以外にバインドすると、トレース履歴全体が公開されます
--demofalseデモ用データベース(実際のトレースとは別)にデータを登録し、それを使ってダッシュボードを提供します
--demo-clearfalseデモ用データベースを削除して終了します
--self-testfalse隔離された一時ホームでオフラインのインストール診断を実行して終了します(0 = 正常、1 = チェック失敗)。設定済みのデータベースも読み取り専用で確認し、このバージョンまたは固定された MCP クライアントで開けない場合は失敗します
--purgefalse設定済みデータベースから保存済みのトレース、スパン、評価をすべて削除し、ファイルを圧縮して、削除したテキストがディスク上に残らないように先行書き込みログを切り詰めてから終了します。デプロイ済みのルール、監査ログ、設定は保持されます。取り消せません。実行中の Iris サーバーを先に停止してください。ファイルはインプレースで圧縮されます。--demo、--demo-clear、--self-test との併用はできません
--version—バージョン(例:1.2.3)のみを標準出力に表示して終了コード 0 で終了します。Iris のホームディレクトリ内は読み取りません

次の 3 つのコマンドは、それぞれ独自の引数を受け取り、実行後に終了します。iris-eval ingest はファイルまたは標準入力からトレースを読み込み(CI ゲート。サーバーは不要です)、iris-eval export traces|evaluations --format csv|jsonl はダッシュボードの一覧と同様にフィルタリングした保存済みデータを標準出力または --out に書き出し(ダッシュボードを使わずにエクスポートする)、iris-eval install <client> は Iris を MCP クライアントの設定に書き込みます。--uninstall は Iris を削除し、--list はこのマシンで見つかったクライアントと、それぞれが実行している Iris を表示し、--upgrade は Iris を実行しているすべてのクライアントをこのバージョンに更新します(独自のエージェントを接続する、更新)。いずれもサーバーは起動しません。

Iris の起動時に config.json が検証されます。 Iris が読み取らないキー(eval.critcalRules のような誤字や、別のツールのキー)、または型が正しくない値があると、完全なキー名、もっとも可能性の高い意図されたキー、または期待される型を示す一文とともに起動が拒否されます。ファイル内の内容が黙って無視されることはありません。

環境変数

すべての環境変数については --help に記載されています。CLI フラグと環境変数の両方が設定されている場合は、CLI フラグが優先されます。

変数説明
IRIS_TRANSPORTトランスポートの種類(stdio または http)
IRIS_HOSTHTTP トランスポートのバインドアドレス(デフォルトは 127.0.0.1)
IRIS_PORTHTTP トランスポートのポート(1~65535、デフォルトは 3000)
IRIS_HOMEユーザーごとのすべてのファイル(config.json、iris.db、custom-rules.json、audit.log、preferences.json)を格納するディレクトリ(デフォルトは ~/.iris)
IRIS_DB_PATHSQLite データベースのパス(データベースに限り、IRIS_HOME を上書きします)
IRIS_SQLITE_DRIVERデータベースを保持する SQLite ドライバー:native(better-sqlite3、デフォルト)または node(Node 組み込みの node:sqlite、Node 22.13 以降)。未設定の場合は native です。ネイティブモジュールを読み込めない場合(またはこの Node で異常終了するビルドの場合)、Iris は一度警告して組み込みドライバーにフォールバックします
IRIS_SEARCH_BUDGET_MS1 回のトレース検索(q)が読み取りを続けられる時間(ミリ秒)。その時点までに見つかった一致結果を返し、search.complete: false になります(50~60000、デフォルトは 1000)。検索中は読み取りの間、ほかのリクエストが待機するため、これが待ち時間の上限にもなります。config.json の storage.searchBudgetMs でも設定できます
IRIS_SEARCH_INDEXon(デフォルト)または off。off にすると、トレースの全文検索インデックスを保持しません。書き込み時はトレースのみを保存し、それ以外は何も行いません。トレース検索(q)では、IRIS_SEARCH_BUDGET_MS の範囲内で新しいものから順にトレース自体を読み取るため、保存件数が多い場合は一致結果の一部しか返せず、search.complete: false になることがあります。無効にすると、データベースに保持されていたインデックスは消去されます。再度有効にすると、新しいインデックスがバックグラウンドで構築されます。config.json の storage.searchIndex でも設定できます
IRIS_LOG_LEVELログレベル:debug、info、warn、error
IRIS_DASHBOARDtrue/1/yes/on で Web ダッシュボードを有効化し、false/0/no/off で無効化します(config.json の dashboard.enabled も上書きします)
IRIS_DASHBOARD_PORTダッシュボードのポート(1~65535、デフォルトは 6920)
IRIS_WEBHOOK_URLモーメント発生時に呼び出される Webhook の受信先。config.json の notify.webhook にマージされます(docs/webhooks.md)
IRIS_WEBHOOK_SECRETWebhook の署名キー(任意の文字列、または whsec_ + base64)。iris 形式では、これがないと実行できません
IRIS_DASHBOARD_HOSTダッシュボードのバインドアドレス(デフォルトは 127.0.0.1)
IRIS_API_KEYHTTP 認証用の API キー。HTTP トランスポートまたはダッシュボードをループバック以外(0.0.0.0、LAN アドレス、コンテナ)にバインドする場合に必須です。これがないと、サーバーは起動を拒否します
IRIS_API_KEY_FILE内容をトリミングした値を API キーとして使うファイルのパス。Docker と Kubernetes でマウントするシークレットファイルの方式で、環境変数ブロックにキーを置かずに済みます。IRIS_API_KEY との同時設定は避け、どちらか一方を設定してください
IRIS_ALLOW_UNAUTHENTICATED意図的にキーなしでループバック以外のアドレスにバインドするには、1 に設定します(起動拒否を解除します。その場合、ネットワークが境界となります)
IRIS_ALLOWED_ORIGINSカンマ区切りのオリジン許可リスト。ダッシュボードでは CORS ヘッダーに使用されます(グロブに対応。例:http://localhost:*)。HTTP トランスポートでは、DNS リバインディング対策として Origin を完全一致で照合します(グロブは無視され、サーバー自身のループバックオリジンは常に許可されます)
IRIS_MAX_INPUT_ELEMENTS検証前に 1 つの入力が保持できる配列要素とオブジェクトキーの最大数(整数、デフォルトは 100000)。すべてのトランスポートでのツール呼び出しの引数と、ダッシュボードポートでのリクエストボディ(API の JSON ボディと POST /v1/traces の JSON または protobuf)が対象です。上限を超えるツール呼び出しにはエラー結果が返され、ボディの場合は 413 が返されます。デフォルト値は、1 MB のリクエストをいっぱいにする場合も含め、正当な JSON 入力をすべて通過させます。POST /v1/traces の protobuf ボディには独自の上限があり、security.requestSizeLimit の 5 バイトごとに 1 要素(1 MB の場合は 209,716)、またはこの設定がそれより大きい場合はその値となります。そのため、リクエストサイズ以内のエクスポーターのバッチが密度を理由に拒否されることはありません(実測した実際のエクスポーターボディで最も密度が高いものは、7.5 バイトごとに 1 要素を保持しています)。コレクターのより大きなバッチに合わせて requestSizeLimit を引き上げると、この上限も引き上げられます。config.json の security.maxInputElements でも設定できます
IRIS_MAX_TOOL_INPUT_ELEMENTS0.21.0 より前の IRIS_MAX_INPUT_ELEMENTS の名称。新しい名称が未設定の場合に読み込まれます(config.json の security.maxToolInputElements も同様です)
IRIS_NO_AUTO_LAUNCH初回実行時のダッシュボード自動起動を無効にするには、1 に設定します
IRIS_ANTHROPIC_API_KEYprovider=anthropic で evaluate_with_llm_judge と verify_citations を使う場合に必須です
IRIS_OPENAI_API_KEYprovider=openai で evaluate_with_llm_judge と verify_citations を使う場合に必須です
IRIS_LLM_JUDGE_MAX_COST_USD_PER_EVALLLM ジャッジ呼び出し 1 回あたりのハードコスト上限(デフォルトは 0.25)。max_cost_usd で呼び出しごとに引き下げられますが、引き上げることはできません
IRIS_RELEVANCE_JUDGE_MODEL料金が設定されたジャッジモデル ID(例:claude-haiku-4-5)。設定され、該当プロバイダーのキーもある場合、answers_the_ask は入力を含むすべての評価でこの LLM ジャッジに判定を依頼し、その関連性判定をゲートとして使います。評価ごとにジャッジ呼び出しが 1 回行われ、上記のコスト上限と下記の 2 つの制限が適用されます。このような評価の入力と出力は、あなたのキーを使ってモデルのプロバイダー(Anthropic または OpenAI)に送信されます。その前に、個人データと認証情報の no_pii フラグが置き換えられます。未設定(デフォルト)の場合、answers_the_ask は質問を語彙的に読み取り、助言を返します。データは送信されません(docs/llm-as-judge.md)
IRIS_LLM_JUDGE_DAILY_BUDGET_USDUTC の 1 日あたり、テナントごとにすべてのジャッジ呼び出しで使用できる合計額(デフォルトは 1)。関連性ジャッジ、evaluate_with_llm_judge、verify_citations で共有されます。データベースに保持されるため、再起動してもリセットされません。最悪の場合のコストが残額以内に収まる場合のみ、呼び出しが行われます。上限を超えると、answers_the_ask は質問を語彙的に読み取り(judge.withheld: "daily_budget")、ジャッジツールは IRIS_BUDGET_EXCEEDED(引用の場合は daily_budget_reached)を返します。0 にすると、すべての呼び出しが停止します
IRIS_RELEVANCE_JUDGE_DAILY_BUDGET_USD0.21.0 より前に、関連性ジャッジのみを制限していた IRIS_LLM_JUDGE_DAILY_BUDGET_USD の名称。新しい名称が未設定の場合に読み込まれ、この変数はすべてのジャッジ呼び出しを制限します。サーバーは起動時にその旨を通知します
IRIS_RELEVANCE_JUDGE_MAX_CALLS_PER_REQUEST1 リクエストで実行できる関連性ジャッジ呼び出しの数(デフォルトは 20)。OTLP バッチまたは evaluate_runs の再スコアでは、最初の 20 個のトレースをジャッジにかけ、残りは語彙的に読み取ります。その場合、judge.withheld: "request_cap" となります
IRIS_RELEVANCE_JUDGE_REDACTon(デフォルト):関連性ジャッジに送信する前に、入力と出力のすべてのスパンにある no_pii フラグ(個人データと認証情報)を [REDACTED:<kind>#<n>] マーカーに置き換えます。off にすると、そのまま送信します
IRIS_CITATION_ALLOW_FETCHverify_citations での外部 HTTP 通信を許可するには、1 に設定します(デフォルトではオフ)。ツールの引数で呼び出しごとに無効化できますが、有効化することはできません
IRIS_CITATION_DOMAINSverify_citations のホスト名許可リスト(カンマ区切り、サフィックス一致)。ツールの引数で範囲を狭めることはできますが、追加することはできません
IRIS_CITATION_MAX_COST_USD_TOTALverify_citations の 1 回の呼び出しでジャッジ呼び出しに使用できる最大額(デフォルトは 1)。max_cost_usd_total で呼び出しごとに引き下げられますが、引き上げることはできません
IRIS_OTEL_ENDPOINTこのコレクター URL への、ベストエフォートの OTLP/HTTP JSON トレースエクスポートを有効にします
IRIS_OTEL_SERVICE_NAMEOTel エクスポート用の service.name リソース属性(デフォルトは iris-eval)
IRIS_OTEL_HEADERSOTel エクスポート用の k=v ヘッダー(カンマ区切り。例:authorization=Bearer abc)
IRIS_OTEL_TIMEOUT_MSエクスポートごとのタイムアウト(デフォルトは 15000)
RATE_LIMIT_SALTウェブサイト専用 — iris-eval.com のプレイグラウンドのレート制限で保持されるアドレスハッシュにソルトを追加します。サーバーがこれを読み込むことはありません
セキュリティ

HTTP トランスポートを使用する場合、Iris には以下が含まれます。

  • タイミングセーフな比較による API キー認証(API クライアントには Bearer、ブラウザーからは ?key= を使ってダッシュボードにサインイン)
  • デフォルトでは CORS を localhost に制限
  • クライアントアドレスおよび分単位のレート制限:ダッシュボード API へのリクエストは 600 件(security.rateLimit.api)、MCP エンドポイントへのリクエストは 20 件(security.rateLimit.mcp)。どちらも config.json で設定します。制限を超えた MCP リクエストには、キー名を示す JSON-RPC エラーが返されます
  • Helmet セキュリティヘッダー
  • すべてのルートで Zod 入力検証
  • カスタム eval ルールには ReDoS に安全な正規表現
  • すべてのトランスポートでリクエストサイズの上限を 1 MB に統一(security.requestSizeLimit):HTTP では 413 を返し、stdio では JSON-RPC エラーを返してセッションを開いたままにします
  • 入力内の配列要素およびオブジェクトキーの上限を 100,000 個に統一し、検証前にカウントします(security.maxInputElements):すべてのトランスポートで、上限を超えたツール呼び出しの引数にはエラー結果を返し、ダッシュボードまたは OTLP のリクエストボディには 413 を返します
  • 検証エラーは最大 20 件の問題と合計数(issueCount)を返すため、リクエストにどれほど誤りがあっても応答は小さく保たれます
# Production deployment
iris-eval --transport http --port 3000 --api-key "$(openssl rand -hex 32)" --dashboard

キーが設定されている場合、API クライアント(MCP クライアント、キャプチャ SDK、POST /api/v1/traces)は Authorization: Bearer <key> を送信します。ブラウザーでダッシュボードを開くには、任意のダッシュボード URL にキーを一度だけ付加します。例:http://localhost:6920/?key=<api key>。Iris はキーを HttpOnly、SameSite=Lax のセッション Cookie と交換し、アドレスバーからキーを削除した同じページにリダイレクトします。セッションのない状態でページを開くと、同じ交換を行うサインインフォームが表示されます。キーはブラウザーに保存されず、セッションはサーバープロセス内にのみ保持されます(同時に有効にできるのは最大 256 件です。すべて有効な状態でサインインしようとした場合、既存のセッションを追い出すのではなく拒否されます)。

本番環境

複数のキーと、停止時間のないローテーション。 config.json の security.apiKeys には、追加のキーをいくつでも設定できます。各キーには id と、keyFile(トリミング後の内容をキーとして使うファイル)または keyHash(キーの sha256 の 16 進数表記。これにより設定ファイルに秘密情報を記載せずに済みます。printf %s "$KEY" | openssl dgst -sha256)のどちらか一方を指定し、任意で expiresAt(ISO 8601)を指定できます。この時刻になると、そのキーは即座に照合対象から外れます。ローテーションするには、新しいキーを追加し、クライアントを切り替えてから、古いキーを削除します。config.json 内のキーとキー ファイル内のキーは、再起動せずに反映されます(0.20.0):リクエストごとに、サーバーは config.json またはそこに記載されたキー ファイルが変更されたかを確認し、変更されていれば応答前にキーを再読み込みします。security.apiKeys からキーを削除するか、そのキー ファイルを削除すると、次のリクエストでそのキーは無効になります。そのリクエストは拒否され、そのキーで開かれたブラウザーセッションはすべてサインアウトされます。config.json を読み取れない場合(例:書き込み途中の場合)、認証は安全側に倒して拒否され、修正されるまでは IRIS_API_KEY または --api-key のキーだけが受け入れられます。IRIS_API_KEY または --api-key 自体のキーと、認証の有効・無効は、引き続き再起動時にのみ変更されます。すべてのキーは削除または有効期限切れになるまで、Bearer 経由でもブラウザーのサインインでも認証に使用できます。起動ログにはキーの ID が記録されます。security.rateLimit.mcpKeyBy: "apiKey" を設定すると、MCP エンドポイントの分単位の上限はクライアントアドレス単位ではなくキー単位でカウントされるため、同じアドレスを共有する複数のエージェントが、それぞれ独自の分単位上限を利用できます。

複数のクライアント。 --transport http は、1 つのアドレスで任意の数の MCP クライアントに対応します。各 initialize は、共通のエンジンとストア上に個別のセッションを開き、同時に最大 256 件まで利用できます。stdio では、各クライアントが独自のサーバープロセスを起動し、それらのプロセスは Iris のホームを共有します。あるプロセスを通じてデプロイ、無効化、または削除されたルールは、20 ms 以内に他のすべてにも反映されます。あるプロセスで書き込まれたラベルは、他のプロセスからもすぐに読み取れます。また、2 つのプロセスが同時にルールを変更しても、どちらの変更も失われません。 HTTP トランスポートまたはダッシュボードをループバック以外(0.0.0.0、LAN アドレス、コンテナなど)にバインドしていて API キーが設定されていない場合、Iris は起動を拒否し、IRIS_API_KEY を明記したメッセージを 1 文で表示します。これには、イメージをそのまま docker run で実行する場合も含まれます。コンテナ内では、公開ポート経由でループバックにアクセスできないため、0.0.0.0 にバインドされます。キーを設定せずにループバックで使う場合は引き続き動作します(HTTP トランスポートには警告が表示されます)。この場合、マシンの境界が公開範囲を制御します。

# The image: pass a key
docker run -p 3000:3000 -p 6920:6920 -v iris-data:/data \
  -e IRIS_API_KEY="$(openssl rand -hex 32)" ghcr.io/iris-eval/mcp-server

# Compose: the file requires the variable and refuses before the container starts
IRIS_API_KEY="$(openssl rand -hex 32)" docker compose up

# A network you have already fenced some other way: run open, on purpose
IRIS_ALLOW_UNAUTHENTICATED=1 iris-eval --transport http --dashboard

キーを設定したサーバーでは、設計上、GET /health(トランスポート)と GET /api/v1/health(ダッシュボード)は、キーなしでも、あらゆるレート制限の対象外で応答します。応答の形式は共通で、ステータス、バージョン、稼働時間、SQLite ドライバー、ストレージ・デプロイルールファイル・マイグレーション(適用済みと既知のものを照合)の checks、検索インデックスの状態(準備完了を示す search、またはトレース全体のうちビルドがどこまで進んだか)、判定キーが設定されているかどうかが含まれます。キーそのものやトレース、その件数は決して含まれません。すべてのチェックが正常な場合に限り、status は ok になります。それ以外の場合は degraded となり、HTTP 503 が返されます。Docker イメージ自身の HEALTHCHECK はこの値を読み取ります。それ以外のすべての機能には、Authorization: Bearer <key> またはブラウザーセッションが必要です。保持期間の処理はすべてのサーバーで実行されます。retention.days(既定値は 30)より古いトレースと評価は、サーバーが応答を開始した後の起動時と、retention.sweepIntervalHours ごとに削除されます。処理は短い単位で実行され、リクエストを長時間待たせることはありません。--self-test はこのインストールのポリシーを出力し、iris://capabilities と GET /api/v1/capabilities では retention として公開されます。

Webhook は特定のイベント発生時に通知します(0.16.0)。config.json の notify.webhook(または IRIS_WEBHOOK_URL と IRIS_WEBHOOK_SECRET)で通知先を指定すると、判定の失敗、重大な検出による拒否、コストの異常値、ルールの失敗率の変動、ケースについて初めて両方の結果が出た場合に、Iris が署名付きメッセージを 1 件送信します。含まれるのは ID、判定、ルール、数値のみで、エージェントのテキストは含まれません。Standard Webhooks と GitHub の両方の方式で署名し、バックオフを伴う再試行を行います。また、エージェントとルールごとに通知をクールダウンし、評価の妨げにはなりません。Slack と Discord の本文形式が組み込まれています。docs/webhooks.md。

ディスク上のデータ

Iris が保存するすべてのデータは、Iris ホーム(~/.iris または IRIS_HOME)の下に格納されます。iris.db には、すべてのトレースの input と output がそのまま保存されます。これには、no_pii が後から検出対象としてフラグを付けるテキストも含まれます。検出では、明示的に指定しない限り、データは編集されません。config.json で storage.redact: "critical_spans" を設定すると、各評価の出力は、クリティカル検出器がフラグを付けたスパンを [REDACTED:<pattern>] に置き換えて保存されます(デフォルトでは無効です。証拠のオフセットは引き続き、呼び出し元が見たテキストを指します)。storage.synchronous は、書き込みがディスクに反映されるタイミングを設定します。normal(デフォルト)では、各チェックポイントで先行書き込みログを同期します。そのため、Iris がクラッシュしてもデータは失われず、ファイルも破損しませんが、停電やオペレーティングシステムのクラッシュが発生すると、最後に同期してからの書き込みが取り消されることがあります。full ではコミットのたびに同期し、どちらの場合も書き込みを保持しますが、書き込みあたり約 1.5 ms 余分にかかります。起動時と、その後は retention.sweepIntervalHours(デフォルトは 24、0 でタイマーを無効化)ごとに、retention.days(デフォルトは 30、0 で無効化。config.json で設定)より古いトレースと評価が削除され、先行書き込みログにチェックポイントが設定されます。保持期間を過ぎても残されるものが 1 つあります。ピン留めされたベースラインの実行と、その評価です。これは、後続のすべての実行との比較対象となるためです。一部を保持する各スイープでは、実行と件数がログに記録されます。実行のピン留めを解除すると、次のスイープで削除されます。データセットのケースとラベルはトレースや評価ではないため、スイープでは削除されません。delete_trace またはスイープによってトレースを削除すると、そのトレースに関連付けられたすべての評価のテキスト(出力、期待されるテキスト、ルールメッセージ)が消去され、erased_at が記録されます。判定結果、スコア、証拠のオフセットはそのまま残ります。各削除では、処理が戻る前に先行書き込みログにチェックポイントが設定されるため、削除したテキストが iris.db や iris.db-wal で読み取り可能なまま残ることはありません(その時点で検索がファイルを読み取っている場合や、別のプロセスが読み書きしている場合、削除処理は待機せずに戻り、その処理が終わるとテキストはファイルから消去されます)。今すぐすべて削除するには、サーバーを停止して --purge を実行します。保存されているすべてのトレース、スパン、評価を削除し、データベースを圧縮して先行書き込みログを切り詰め、テキストをディスクから消去します。デプロイ済みのルール、監査ログ、設定は保持されます。リリース適用時に既存の iris.db にマイグレーションを適用する前に、ファイルのコピーが同じディレクトリに作成されます(iris.db.<from>-to-<to>.<time>.bak、所有者のみがアクセス可能で、最新の 3 つを保持。ダウングレード)。コピーには元の状態のトレースが含まれるため、保持期間のスイープで retention.days より古いものが削除され、--purge ですべて削除されます。サーバーはクライアントへの応答後、独立したスレッドでコピーとマイグレーションを実行します。その間に到着したツール呼び出し、リソース読み取り、HTTP リクエストは最大 30 秒ずつ待機し、その後、サーバーが実行中の処理を説明する文とともに拒否されます(再試行可能な IRIS_STORAGE_ERROR。HTTP 503 と Retry-After)。ヘルスチェックにはその間も応答し、アップグレードの実行状況を伝えます。0.19.0 で、各トレースがエージェントのループにあたる 100,000 件を処理した際、コピーとマイグレーションに約 6 秒かかりました。iris-eval ingest、--purge、--self-test は、ほかの処理を行う前に引き続きアップグレードを実行します。

Iris は保存データを暗号化しません。iris.db と先行書き込みログのファイルは所有者のみがアクセスできる権限(モード 600)で作成され、Iris ホームディレクトリはモード 700 で作成されます(Windows では、代わりにファイル ACL が適用されます)。データベースに LLM プロバイダーのキーは保存されません。IRIS_ANTHROPIC_API_KEY と IRIS_OPENAI_API_KEY は環境変数から読み込まれ、ディスクには書き込まれません。ただし、トレースの入力と出力はそのまま保存されるため、Iris ホームは暗号化されたディスクまたはボリューム(FileVault、BitLocker、LUKS、または Docker イメージの /data マウント用の暗号化されたクラウドボリューム)に配置してください。 エクスポート — ダッシュボードの「トレース」ページと「評価」ページにある エクスポート ボタン、GET /api/v1/traces/export と /api/v1/evaluations/export、または iris-eval export — には、保存されたテキストがそのまま含まれます。ダッシュボードに表示される内容と同じで、トレースの入力と出力はそのまま、評価の出力には storage.redact が適用されます。エクスポートされたファイルは、元のデータベースと同じように扱ってください。

トラブルシューティング
まずはセルフテストを実行する
npx @iris-eval/mcp-server --self-test

ストレージ、決定論的な評価、ダッシュボードを隔離された一時ホームでチェックし、手順ごとの判定を出力します。失敗した場合は、出力に問題のある手順が示されます。終了コード 0 は、インストールが正常であることを意味します。

Iris が起動しない/ERR_MODULE_NOT_FOUND

古いバージョンがキャッシュされている可能性があります。npx のキャッシュを消去して、再試行してください。

npx --yes @iris-eval/mcp-server@latest

または、キャッシュの問題を完全に避けるため、グローバルにインストールしてください。

npm install -g @iris-eval/mcp-server@latest
npm install --ignore-scripts によって SQLite バインディングが壊れた

Iris は better-sqlite3 でトレースを保存します。これは、インストールスクリプトでバインディングを取得またはコンパイルするネイティブモジュールです。このスクリプトがスキップされた場合 — コマンドラインでの --ignore-scripts、.npmrc の ignore-scripts=true(企業のマシンでよくあります)、または postinstall を取り除くレジストリミラーなど — 起動時に、試したパスが十数個列挙された長い「Could not locate the bindings file」エラーが表示されて失敗します。そのモジュールだけを再ビルドしてください。

npm rebuild better-sqlite3
# for a global install:
npm rebuild -g better-sqlite3
Claude Code にツールが表示されない

MCP ツールはセッション開始時にのみ読み込まれます。iris-eval を追加した後は、/clear でセッションを再起動するか、ターミナルを再起動してください。

バージョンの確認
npx @iris-eval/mcp-server --version

最初の起動ログ行にも表示されます(Starting Iris MCP server vX.Y.Z)。また、--self-test の概要にも表示されます。グローバルインストールの場合は、npm ls -g @iris-eval/mcp-server でインストール済みのバージョンを確認できます。

更新

マシン上のすべての MCP クライアントは、1 つのデータベース ~/.iris/iris.db を共有します。また、install により、各クライアントは設定を書き込んだリリースに固定されます。リリースによってデータベースのスキーマが変更される場合、そのリリースを実行する最初のプロセスがファイルを開いたときにスキーマがアップグレードされます。その後は、古いリリースに固定されたクライアントは起動を拒否します。そのため、アップグレードの前または直後に、すべてのクライアントをまとめて更新してください。

npx -y @iris-eval/mcp-server@latest install --upgrade

このコマンドは、このマシンで Iris を実行するすべてのクライアント設定を探し、各クライアントのバージョン固定をそのリリースに更新します(--dashboard や env ブロックなど、エントリに追加した内容は保持します)。より新しいリリースへの固定や、npm パッケージ以外を実行するエントリは変更せず、実行内容を一覧表示します。表示されたクライアントを再起動してください。install --list では、各クライアントが実行する Iris を確認できます。

設定ファイル以外にあるインストールが 2 つあります。Claude Desktop 拡張機能(iris-eval.mcpb)は、新しいバンドルを開くと更新されます。Claude Code プラグインは、claude plugin marketplace update iris-eval の後に claude plugin update iris-eval@iris-eval を実行して更新します(キャプチャプラグインの場合は claude plugin update iris-eval-capture@iris-eval も実行します)。

0.19.x から 0.20.0 へのアップグレード。 0.20.0 では、検索インデックスなどがデータベースに追加されます(マイグレーション 015 以降)。0.20.0 のプロセスが ~/.iris/iris.db を一度でも開くと(Claude Desktop 拡張機能、npx iris-eval、またはバージョンを指定しない npx @iris-eval/mcp-server など)、0.19.x に固定されたクライアントは This database was migrated by a newer Iris (…) — migration(s) 015-trace-search, … are unknown to v0.19.0. Upgrade Iris, … というメッセージを表示して停止します。このメッセージは 0.19.x から出力されるため変更できません。上記のコマンドで解決してください。アップグレード前に、0.20.0 はファイルのコピーを隣に作成するため、元に戻すこともできます(下記参照)。

データベースをアップグレードする起動では、実行内容が標準エラー出力に表示されます。作成したコピー、ファイルを開けなくなる古いリリース、このマシンでそのいずれかに固定されているクライアントと、その更新コマンドが示されます。--self-test はデータベースを変更せずに読み取り、何かを起動する前に同じ内容を表示します。

グローバルインストールの場合は、npm update -g @iris-eval/mcp-server を実行してから、iris-eval install --upgrade を実行してください。

### ダウングレード

データベースをアップグレードするリリースでは、まずデータベースのコピーが作成されます。コピーは同じディレクトリにあり、ファイル名は iris.db.<from>-to-<to>.<time>.bak です。Iris のホームディレクトリに保存されます(<from> はファイルのスキーマを最後に変更したリリース、<to> はアップグレードしたリリースです。起動時のログに正確なパスが表示されます)。元に戻すには、次の手順を実行します。

  1. データベースを使用しているすべての MCP クライアントと、ほかの Iris プロセスを停止します。
  2. 後で戻す場合に備えて、アップグレード後のファイルを残します。iris.db を iris.db.upgraded に名前を変更し、存在する場合は iris.db-wal と iris.db-shm を削除します。
  3. バックアップを iris.db にコピーします。cp ~/.iris/iris.db.0.19.0-to-0.20.0.<time>.bak ~/.iris/iris.db
  4. すべてのクライアントを以前のリリースに戻します。それぞれのクライアントで npx -y @iris-eval/[email protected] install <client> を実行します(install --upgrade でクライアントを以前のリリースに戻すことはできません)。

アップグレード後に保存されたトレースは、バックアップではなく iris.db.upgraded にあります。コピーが作成されなかった場合(たとえば、ディスクがいっぱいだったなど、その理由は起動時のログに表示されます)、以前のリリースではアップグレード後のファイルを開けないため、install --upgrade を実行する必要があります。

ストレージドライバー

better-sqlite3 のビルド済みバイナリがないプラットフォームでも、インストールは成功します。 better-sqlite3 はオプションの依存関係です。npm が使用中の Node とプラットフォーム向けのビルド済みバイナリをダウンロードできず、コンパイルもできない場合(コンパイルには Python と C++ ツールチェーンが必要です。Windows では Visual Studio の C++ ビルドツールが必要です)、npm はビルドエラーを表示し、そのモジュールをスキップしてインストールを完了します。その後、Iris は Node に組み込まれた SQLite で動作します。起動時には、理由を示す1行が stderr に出力され、--self-test には driver node: better-sqlite3 is not installed … と表示されます。ネイティブドライバーを再び使うには、ビルド済みバイナリまたはツールチェーンが利用できる環境でインストールしてください(プロジェクトでは npm install better-sqlite3 を実行します。グローバルインストールの場合は、ツールチェーンが利用可能になったら npm install -g @iris-eval/mcp-server で Iris を再インストールしてください)。CI では変更のたびに、ネイティブビルドを強制的に失敗させた状態でパッケージ化済みのサーバーをインストールし、インストールが完了することと、組み込みドライバーでトレースを保存して読み取るセルフテストが成功することを必須としています。

Iris はすべてのデータを1つの SQLite ファイルに保存し、Node とプラットフォーム向けにダウンロードまたはコンパイルされたネイティブアドオン better-sqlite3 を使って開きます。このモジュールを読み込めない場合、Iris は Node に組み込まれた SQLite(node:sqlite、Node 22.13 以降)にフォールバックし、stderr に警告を1つ出力します。そのため、ビルド済みバイナリがなくても起動に失敗するのではなく、起動が遅くなります。また、Node 24.19 以降のヘッダーに対してマシン上でコンパイルされた better-sqlite3 を Node 24.19~24.21 で実行する場合も、読み込む前に同様の処理を行います。この場合、そのバイナリはステートメントを最初に解放する際にプロセス全体を異常終了させます(Assertion failed: (env) != nullptr、nodejs/node#65446)。Node 24.22.0 には修正が含まれており、Iris はそこでバイナリを読み込みます。npm rebuild better-sqlite3 を実行すると、すべてのバージョンで安全に使えるビルド済みバイナリに置き換わります。IRIS_SQLITE_DRIVER=node は意図的に組み込みドライバーを選択し、native はフォールバックを禁止します。組み込みドライバーは、拡張機能の読み込みと trusted_schema を無効にして開かれます。Node は読み込み時に独自の ExperimentalWarning: SQLite is an experimental feature という行を stderr に出力し、Iris がこれを抑制することはありません。--self-test と GET /health には使用中のドライバーが表示されます。実績ページの数値はすべてネイティブドライバーで計測されており、テストスイートは CI で両方のドライバーを使って実行されます。

Node.js のバージョン

Iris の動作には Node.js 22.13 以降が必要です。Node 20 は2026-04-30にサポート終了となり、サポート対象外です。Node 18 は2025年4月にサポート終了となりました。

下限が 22.0 ではなく 22.13 なのは、node:sqlite を搭載した最初のリリースが 22.13.0 だからです。これにより、すべてのサポート対象の Iris インストールで、2つ目のストレージドライバーが利用可能になります。ネイティブの better-sqlite3 アドオンを読み込めない場合、Iris は起動に失敗するのではなく、Node に組み込まれた SQLite にフォールバックします。22.13 より前のバージョンでは、また Node 20 の全期間を通じて、ドライバーは1つしかなく、ビルド済みバイナリがない場合は起動できませんでした。

node --version  # Must be v22.13.0 or newer
Windows:cmd /c は不要です

Claude Code の /doctor で、npx を cmd /c でラップするよう提案されることがあります。これは不要で、パスの解析に問題が生じます。npx を直接使用してください:

# Correct
claude mcp add --transport stdio iris-eval -- npx -y @iris-eval/mcp-server

# Wrong (causes /c to be parsed as a path)
claude mcp add --transport stdio iris-eval -- cmd /c "npx -y @iris-eval/mcp-server"

Iris が役に立った場合は、リポジトリにスターを付けることをご検討ください。より多くの人に見つけてもらいやすくなります。

GitHub でスターを付ける

MIT ライセンスです。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。