self-inspect-mcp について
self-inspect-mcp は、エージェントの考えやタスクの説明から、前提を見直すためのメタ思考の問いを返す MCP サーバーです。オープンな CSV に基づく決定的なヒューリスティックを使い、LLM を介さず、ホスト型とオフラインの両方で実行できます。
主な機能
- 01入力に応じた問いの選択
- 02必ず問いを返す設計
- 03決定的で監査可能な結果
- 04ホスト型とオフライン実行
- 05REST と Python のエンジン
活用シーン
- 01行動前に前提を確認
- 02計画や回答の確定前に再検討
- 03長い推論中の目標逸脱を検出
- 04確信が強まったとき結論を見直す
MCP 対応
MCP サーバーは `thought` を受け取り、メタ思考の問いを返す `self_inspect` ツールを1つ公開します。既定ではホスト型エンドポイントを使い、`SELF_INSPECT_LOCAL=1` でローカル実行に切り替えられます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://api.ejentum.com/self-inspect-mcpclaude mcp add --transport http ejentum-self-inspect https://api.ejentum.com/self-inspect-mcp{"mcpServers":{"ejentum-self-inspect":{"type":"http","url":"https://api.ejentum.com/self-inspect-mcp"}}}Cursor で開く{"servers":{"ejentum-self-inspect":{"type":"http","url":"https://api.ejentum.com/self-inspect-mcp"}}}VS Code で開く{"mcpServers":{"ejentum-self-inspect":{"type":"http","url":"https://api.ejentum.com/self-inspect-mcp"}}}{"mcpServers":{"ejentum-self-inspect":{"serverUrl":"https://api.ejentum.com/self-inspect-mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Self-Inspect
エージェントが自分に問いかけようとは思わない質問。
エージェントが思考、または取り組んでいるタスクの説明を送ると、ひとつのメタ思考が返されます。エージェントが先に進む前に、自分のタスクや前提へと注意を向け直す、短く抽象的な質問です。アドバイスでも、答えでもありません。質問です。
キー不要、無料、決定論的です。LLM も、埋め込み表現も、意味的類似性も使用しません。選択には、5 分で読めるオープンな CSV に対する小さなヒューリスティックを使います。また、api.ejentum.com/self-inspect が回答を生成するコードは、このリポジトリにあるコードそのものです。両者が乖離しないことをテストで確認しています。
エージェントに必要な理由
エージェントは先へ進みます。問題はそこにあります。何もしなければ、エージェントは次のようになります。
- 最初の解釈に固執し、それを見直さない。
- 名前をつけないまま、前提を積み重ねる。
- 長い手順の連続の中で、当初の目標からずれていく。
- もっともらしい最初の答えで止まる。
- 根拠が増えていないのに、自信だけを深める。
- 同意するのが簡単なので、ユーザーに同意する。
これらは知識の不足によるものではありません。モデルは、すでにもっとよい判断を知っています。問題は注意力の不足です。エージェントは、気づきにつながるはずのひとつの質問を立ち止まって考えません。
そして、その質問を自分で安定して問いかけることもできません。何を振り返るかを選ぶのも、すでにひとつの考えに固執しているのと同じプロセスだからです。そのため、「再確認」するエージェントは、自分の偏りをなぞり直して、それを自信と呼びがちです。落とし穴を認識しても、そこから抜け出せるとは限りません。
Self-Inspect は、外部から問いかけます。エージェントだけでは生み出せなかったメタ思考を返します。*何が前提になっているのか。何が固定されているのか。何が導けないのか。何が足りないのか。どのような場合に成り立たないのか。どの程度の自信が妥当なのか。*考えるのは、あくまでエージェントです。このツールは、考えるきっかけを与えるだけです。
呼び出すタイミング
エージェントがそのまま突き進んでしまいそうなタイミングで、ワークフローに組み込みます。
- 仮説を立てたあと、それに基づいて行動する前。
- 計画や最終回答を確定する前。
- 長い手順の各段階で、ずれを捉えるため。
- エージェントが同意している、または確信していると気づいたとき。
思考を送ってメタ思考を受け取り、自分で答えてから、より意識的に先へ進みます。必ず質問が返されます(「結果なし」はありません)。呼び出しは一度だけで、処理にモデルは不要、キーも必要ありません。
メタ思考の活用方法(手順)
Self-Inspect は、主張が暗黙のうちに頼っている前提を明らかにする、ひとつの質問を返します。具体的な反例を使って答え、どこが崩れるかをもとに主張を組み立て直してください。質問を認めるだけで先へ進んではいけません。自力では越えられない、本当の行き詰まりに直面したときだけ呼び出し、決まった間隔で呼び出すのは避けてください。毎回使うよう強制すると、使わない場合より見劣りする、見せかけの修正が生まれます。(この手順こそが、私たち自身の評価で、もっとも優れた実行結果ともっとも弱い実行結果を分けました。)
評価で分かったこと
複数回のベンチマーク(小型モデルと最先端モデル、40ターンの自由形式の推論、順序を入れ替えたブラインド判定)から、次のことが分かりました。
- 信頼性が高く、監査可能です。 メタ思考は決定論的に返され、呼び出しのたびにバイト単位で同一の結果が得られるため、エージェントが何を確認したかを検証可能な、モデルに依存しない記録として残せます。最も強力で、最も確実に主張できる特性です。
- エージェントに自らの前提を疑わせたのは、これだけでした。 ツールを使わない対照実験では、確信に満ちた理論を組み立て、作話している可能性を一度も問いませんでした。一方、self-inspect を使うと、エージェントは自力では気づけなかった、議論の根幹を成す前提を明らかにし、名前を付けました。また、本当に行き詰まったときには、その問いによって調査の方向が新たな領域へと切り替わり、すでに向かっていた結論を確認するだけに終わりませんでした。
- 効果の向上には条件があり、自動的に得られるわけではありません。 実際の反例を示して問いに答え、主張を組み立て直した場合にのみ効果が見られます。また、その呼び出しが本当に行き詰まったタイミングで行われ、モデルに行き詰まりを判断できる能力がある場合に限られます。毎ステップ呼び出すと、全体として逆効果です。段取りどおりの修正(過剰な主張をした後、予定された撤回を行うこと)を生み出し、ツールを使わない場合よりも判定結果が悪くなります。
- ラッパーではなく、条件付きのチェックポイントとして使ってください。 重要なタイミングで推論を分かりやすく、検証可能にしますが、弱い推論能力を強くするものではありません。
クイックスタート
thought を送ると、metathought が返されます。キーは不要です。
REST(任意の言語):
curl -s -X POST https://api.ejentum.com/self-inspect \
-H "Content-Type: application/json" \
-d '{"thought":"I am committing to this architecture and treating it as fixed"}'
# -> [{ "label": "commitment", "metathought": "What is fixed?" }]
MCP、Claude Code:
claude mcp add --transport http self-inspect https://api.ejentum.com/self-inspect-mcp
MCP、Claude Desktop / Cursor / 任意の HTTP-MCP クライアント:
{
"mcpServers": {
"self-inspect": {
"type": "http",
"url": "https://api.ejentum.com/self-inspect-mcp"
}
}
}
MCP サーバーは、thought を受け取り、メタ思考を返す self_inspect というツールを1つ公開しています。インストールもキーも不要です。
Python(単一ファイル、依存関係ゼロ):
Python 環境では、dist/self_inspect.py がエンジン全体を1つのファイルにまとめています。CSV はファイル内に埋め込まれており、標準ライブラリのみを使用するため、インストールは不要です。公開されているものとまったく同じセレクターをローカルで実行できます(1回の呼び出しにつき約2 ms、ネットワーク不要)。
python self_inspect.py "I am committing to this architecture and treating it as fixed"
# -> [{"label": "commitment", "metathought": "What is fixed?"}]
from self_inspect import self_inspect
self_inspect("I am about to assert the default timeout is 30s from memory")
# -> {"label": ..., "metathought": ...}
クロス言語の同等性テスト(test/parity.python.test.mjs)により、JS エンジンとバイト単位で同一であることを確認しています。同じ thought に対して、Python、JS、またはホストされたエンドポイントのいずれでも同じ metathought が得られます。
エンドポイント
| サーフェス | エンドポイント | 認証 | 返される内容 |
|---|---|---|---|
| REST | POST https://api.ejentum.com/self-inspect | キー不要、IPごとのレート制限(120/分) | [{ label, metathought }] |
| HTTP 経由の MCP | https://api.ejentum.com/self-inspect-mcp(Streamable HTTP) | キー不要、IPごとのレート制限(60/分) | ツール self_inspect -> メタ思考のテキスト |
| MCP stdio / オフライン | mcp/ パッケージ。SELF_INSPECT_LOCAL=1 を指定するとセレクターをローカルで実行 | キー不要 | ツール self_inspect(npx self-inspect-mcp) |
ホストされている両方のエンドポイントはキー不要で、IPごとのレート制限と標準的なセキュリティヘッダー(HSTS、nosniff、フレーム拒否)によって保護されています。
選択の仕組み
select(thought, rows)(src/selector.js)は、selfinspect.csv のデータを対象に、決定論的な2段階のルーティングを行います。
- 思考を正規化します。小文字化し、Unicode NFKC を適用し、英数字以外をスペースに置き換えて、空白をまとめ、トークン化します(
src/normalize.js)。 - 各レンズ(
input_type)のスコアを計算します。思考に含まれるタイプ名のトークン数 × 3 + そのレンズの質問に含まれる、思考と一致する異なるコンテンツトークンの数 × 1。コンテンツトークンは、少数の公開ストップワードリストを除いたmeta_thoughtの語です。根拠はレンズのすべての質問にわたって集計されるため、複数の行に分散したシグナルによってレンズが選ばれることもあります。 - スコアが最も高いレンズを選びます。同点の場合は、
strictをboosterより優先し、次にレンズ名の辞書順で選びます。 - 選ばれたレンズ内で、ローカルのコンテンツ一致が最も多い質問を返します。同点の場合は、
operator_rankが最も小さい質問(標準質問)を優先します。matched: trueです。 - どのレンズにもシグナルがない場合は、普遍的な自己点検の質問(タスクと前提について)を返します。小さなデフォルトセットから入力の安定ハッシュに基づいて決定論的に選ぶため、入力ごとに異なる問いかけになります。
matched: falseです。
Self-Inspect は常にメタ思考を返します。 エージェントが自分のタスクと前提について問いかけられる価値ある質問は必ずあるため、このツールが null を返すことはありません。matched フラグは、ルーティングされたレンズ(true)と普遍的なデフォルト(false)を区別します。metathought が空になることはありません。決定論的であり、同じ入力には常に同じメタ思考を返します。(特定のレンズにルーティングされる入力を増やすには、CSV に文言を追加するか、将来的に triggers 列を追加してください。モデルは使いません。)
CSV が唯一の信頼できる情報源です
selfinspect.csv(約50のレンズ、137の質問):
| 列 | 役割 | 呼び出し元に渡される内容 |
|---|---|---|
input_type | 認知レンズ。その名前のトークンはルーティングキーとして3倍の重みが付けられます | id の一部 |
operator_rank | レンズ内の順序(1 = 標準)。同点時の優先順位 | id の一部 |
runtime_tier | strict(コア)または booster(知覚)。同点時は strict を優先 | なし |
meta_thought | 返されるテキスト(そのまま)であり、コンテンツルーティングトークンの情報源でもあります | はい |
返される id は input_type-operator_rank です(例:confidence-4)。メタ思考を追加または変更するには、CSV を編集してください。dist/backend.cjs やデプロイ済みのコピーを手動で編集しないでください。
公開版とデプロイ版は一致します(約束ではなく、仕組みによって保証)
npm run build は、selfinspect.csv、src/normalize.js、src/selector.js から dist/backend.cjs(ホストされたエンドポイントのエンジン)と dist/self_inspect.py(単一ファイルの Python ポート)を再生成します(build/generate.mjs)。
test/drift.test.mjs は、コミット済みのいずれかの成果物がジェネレーターの出力とバイト単位で一致しない場合に失敗します。また、test/parity.python.test.mjs は、Python ポートの結果が全コーパスにおいて JS セレクターと異なる場合に失敗します。そのため、どちらの言語でも、CSV/セレクターと異なるエンジンは CI を通過できません。全テストスイートは、Python がインストールされたランナー上で、すべてのプッシュとプルリクエスト時に実行されます(.github/workflows/ci.yml)。これにより、パリティテストが実際に実行されます。このリポジトリは誰でもクローンし、フィクスチャをローカルとライブエンドポイントの両方で実行して、同一の選択結果を確認できます。
検証
npm test # selector fixtures + drift test
npm run build # regenerate dist/backend.cjs
git diff --exit-code dist/backend.cjs # clean == no drift
評価
メタ思考は実際に何を変えるのでしょうか。30ターンのソフトウェア設計の会話で、ターンごとに一度 Self-Inspect を呼び出したエージェントは、ツールを使わないまったく同じエージェントよりも、約3.5倍多くの意思決定の分岐点(前提、エッジケース、事前条件)を明らかにしました。モデル(Claude Sonnet 4.6)、会話、プロンプトはすべて同じです。
そして、質問は一般論ではなく、狙いを定めたものです。ルーティングはその時点の状況を捉えていました。エージェントが境界に関する判断を下そうとしていたときに When would this not hold? が届き、状態を永続化しようとしていたときに What is assumed? が届きました。後者に対して、エージェントは 「永続化はモジュールの外にあると想定していました」 と答え、それまで一度も明言していなかった前提を表面化させました。
完全なデータ、そのままのメタ思考、そしてワンコマンドでの再現手順(node evals/tools/analyze.mjs)は evals/ にあります。
レスポンスの仕様
REST は、input_type のレンズである label と、質問である metathought の2つのフィールドだけを持つオブジェクトを1つ含む配列を返します。ルーティングできない入力の場合も、同じ形式で汎用のデフォルトを返します(レンズは異なります)。
{"thought":"How much confidence is warranted in this result?"} -> [{ "label": "confidence", "metathought": "What confidence is warranted?" }]
{"thought":"order a pizza"} -> [{ "label": "sequence", "metathought": "What order is active?" }]
MCP のサーフェス(self_inspect)は、metathought のテキストのみを返します。
エンジンのデプロイ(運用者向け)
ホスト側では、同じ CSV とセレクターの CommonJS ビルドである dist/backend.cjs を、認証やティアから独立したキー不要の Express ルート内で実行します。dist/backend.cjs は npm run build で再生成され、ソースとの乖離がテストされます。更新するには、selfinspect.csv を編集して npm run build を実行し、ビルドを再デプロイしてください。デプロイ済みのコピーを手作業で編集しないでください。
MCP
mcp/ は、1つのツール self_inspect を公開するスタンドアロンの MCP サーバー(self-inspect-mcp)です。デフォルトではホストされたエンドポイントを呼び出します。ベンダー提供の CSV コピーを使って、このセレクターをオフラインで実行するには、SELF_INSPECT_LOCAL=1 を設定してください。mcp/README.md を参照してください。
トラブルシューティング
接続時に CRYPT_E_NO_REVOCATION_CHECK または TLS の失効エラーが発生する。 証明書は有効です(Let's Encrypt、完全なチェーン、verify ok)。TLS では Let's Encrypt を使用しています。Let's Encrypt は現在 CRL ベースであり、2026年に認証局によって OCSP が廃止されたため、照会できる OCSP レスポンダーはありません。OCSP が利用できない場合に証明書の失効確認で厳格に失敗するクライアント(一部の Windows/schannel の構成など)では、証明書に問題がなくてもこのエラーが報告されることがあります。ほとんどのクライアント(Node、Python TLS)はソフトフェイルするため、通常どおり接続できます。厳格に失敗する場合は、失効確認をソフトフェイルに設定してください。証明書は有効です。
ライセンス
MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。