mcpField
M
MIMIR

MIMIR

ローカル
github.comAI・エージェント33 週間前に更新

MIMIR について

MIMIRは、エージェント向けの非生成型意思決定モデルです。型付き回答、校正済み確率、根拠、実行またはエスカレーションの判定を返し、ローカルとHTTPで利用できます。

主な機能

  1. 017種類の型付き意思決定
  2. 02校正済み確率と根拠
  3. 03不確実な場合の棄却・保留
  4. 04ツール呼び出しの権限チェック
  5. 05ローカル、HTTP、非同期に対応

活用シーン

  1. 01サポート依頼の担当部署への振り分け
  2. 02不確実な判定の人手レビューへの移行
  3. 03ポリシーに基づくエージェントのツール呼び出し確認

MCP 対応

MCPサーバーは、コンテキストを受け取る設定済みの意思決定ツールを公開し、選択・検証・順位付け・評価用の汎用ツールも追加できます。保留された判定は、エスカレーションを示す結果として返されます。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"abderahmane-ai-mimir": {
"command": "uvx",
"args": [
"mimir-decisions"
]
}
}
}
起動コマンドuvx mimir-decisions

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypimimir-decisions1.2.0
ocighcr.io/abderahmane-ai/mimir:1.2.0-cpu

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

mimir-decisions

エージェントが行動に移せる意思決定。 MIMIR は生成を行わない意思決定モデルです。コンテキスト、質問、選択肢を渡すと、型付きの回答と較正済み確率、その根拠、さらに実行するかエスカレーションするかを示す認証済み判定を返します。テキストは生成されません。解析するものもありません。ハルシネーションが起こることもありません。

6つのタスクの直接対決で、10タスク中6タスクにおいて Laya と GLiNER2.5-Decide を上回りました。Banking77 では54.7ポイント、MASSIVE では42.3ポイント、型付き意思決定では36.3ポイントの差をつけています。また、回答を裏付けられない場合は推測せず、回答を保留します。

pip install "mimir-decisions[local]"        # the local engine (CPU and CUDA)
pip install mimir-decisions                  # data models and HTTP client only

Python 3.11+。ドキュメント:https://abderahmane-ai.github.io/mimir/


MIMIR を選ぶ理由

多くのエージェントは、汎用言語モデルを使ってルーティング、分類、検証を行います。処理は遅く、コストがかかり、監査もできません。MIMIR は構造化された意思決定のために構築されています。Torch 上でローカルに CPU または GPU を使って動作し、回答ごとに較正済み確率を返し、証明書を発行します。これは、保留データにおいて、しきい値を通過した回答が指定したリスクレベル以下にとどまったことを測定した証拠です。

  • 生成なし。 回答は、合成されたものではなく、指定した選択肢から選ばれます。モデルがリストにない回答をハルシネーションすることはありません。
  • 較正済みの信頼度。 確率はソフトマックススコアではありません。保留データにおける実際の正解率に合うよう較正されています。
  • 常に回答。 すべての意思決定で、確率を伴うモデルの予測が返されます。threshold モードと certified モードでは、下限に満たない回答はレビュー用に deferred として返されます。回答が保留されることはありません。
  • 統一された型付き契約。 choice、multi-choice、yes/no、verify、rank、rate、estimate の7つの意思決定タイプが、あらゆるコンテキストに対して、同じ形式の結果を返します。
  • ポータブル。 同じ Python インターフェースを、ローカルの CPU または GPU、HTTP、MCP で使用できます。8つのエージェント SDK 用のフレームワークアダプターもあります。

クイックスタート

from mimir import Context, Field, Mimir, Passage

model = Mimir.from_pretrained("Mythologic/MIMIR-1")

# The short form: the chosen option id, or None when the model abstains or defers
team = model.pick(
    "Hi, invoice INV-8821 was billed twice. Please refund the duplicate.",
    ["billing", "technical", "sales"],
)  # "billing"

# Context pairs prose passages with typed structured fields (amounts, IDs, metadata)
context = Context(
    passages=[
        Passage(
            title="Ticket #4091",
            text="Hi, we were billed twice ($2,400 total) on invoice INV-8821. Please refund the $1,200 duplicate today or we will cancel our plan.",
        )
    ],
    fields=Field.from_json({
        "invoice_id": "INV-8821",
        "duplicate_amount": 1200,
        "customer_plan": "enterprise",
    }),
)

# The question is optional: model.choose(context, options) asks "Which option applies to this context?"
result = model.choose(
    context,
    "Which department should handle this request?",
    options={
        "billing": "Billing: invoices, payments, refunds",
        "technical": "Technical: bugs, outages, system errors",
        "sales": "Sales: pricing, new contracts",
        "other": "Other: everything else",
    },
)

result.status         # Status.DECIDED, Status.ABSTAINED or Status.DEFERRED
result.answer         # "billing", or None when no option applies
result.probabilities  # calibrated probability of each option id
result.certificate    # mathematical proof of risk bound on held-out data

answer は常にモデルの予測です。status は、運用上の下限を満たしたかどうかを示します。

  • DECIDED — answer に基づいて行動します。
  • ABSTAINED — 該当する選択肢がありません(明確な OOD 拒否)。
  • DEFERRED — 回答が証明書の下限を下回ったため、人間のレビュー担当者に回されます。
リスクダイヤル:ミッションクリティカルな SLA から高スループットのエージェントまで

このリリースでは、4つの有限サンプルリスクレベルにわたるしきい値を認証しています(model.info().risk_levels = (0.005, 0.01, 0.02, 0.05))。

  • risk=0.01(SLA 99.0%) — 航空宇宙/金融のミッションクリティカルな SLA:統計上の下限を極めて厳しく設定します。ほぼ確実な回答のみが自動で実行され、不確かな回答はリスクにさらさず、人間によるレビューに回されます。
  • risk=0.05(SLA 95.0%、デフォルト) — 高スループットの Web エージェント/顧客ワークフロー:自律型エージェントに最適な設定です。正当なリクエストの自動実行を可能にしつつ、保留データにおけるエラー率を数学的に制限します。
  • mode="standard" — 有限サンプルリスクによる保留を行わず、較正済みの argmax を返します。この場合、risk は結果に付与する証明書の選択にのみ使用されます。mode="certified" では、risk で認証されたしきい値を下回る場合も保留します。

チケットは、人が書いたとおりの文章に型付きフィールドを添えてモデルに渡してください。同じ選択肢でも、1行の要約を使うと ABSTAINED になる場合があります。質問と選択肢の形式については、意思決定ガイドをご覧ください。

初回の呼び出しでは、このパッケージのバージョンで固定されたリビジョンのモデルを Hugging Face Hub からダウンロードし、Sigstore 署名を検証し、マニフェストに記載された SHA-256 とすべてのファイルを照合してから読み込みます。


決定の種類

Spec回答
Choice(question, options)オプションの ID、または None
MultiChoice(question, options)該当するオプションの ID
YesNo(question)True または False
Verify(claim)supported、contradicted、または not_enough_information
Rank(question, candidates)候補の ID(最良のものから順)
Rate(question, levels)レベルの ID。レベルは低い順に指定します
Estimate(question, low, high, unit)[low, high] の範囲内の数値と信頼区間
from mimir import Context, Field, Passage, Rate, Table

context = Context(
    passages=[Passage(title="Ticket #4412", text="The export has failed every night this week.")],
    tables=[Table.from_rows([["2026-03-02", "failed"]], header=["date", "status"])],
    fields=Field.from_json({"customer": {"plan": "enterprise", "seats": 240}}),
)
result = model.decide(context, Rate("How urgent is this?", ["low", "medium", "high"]), risk=0.01)

コンテキストには、文字列、文字列のリスト、JSON の状態として読み込まれる dict、または型付きの文章、テーブル、フィールドを含む Context を指定できます。Table.from_dataframe(frame) は pandas または polars の DataFrame を読み込みます。decide_many は複数の決定をまとめて処理し、すべてのメソッドには非同期版(adecide、adecide_many、…)があります。


認証

decide は standard モードですべてのリクエストに回答します。threshold モードでは、min_confidence を下回る回答を保留します。certified モードでは、risk におけるリリースのしきい値(model.info().risk_levels)を下回る回答を保留し、回答がしきい値を満たす場合は証明書を添付します。誤ったアクションに大きなペナルティが伴うミッションクリティカルな運用では risk=0.01(99% SLA)、高スループットの自律型エージェントでは risk=0.05(95% SLA)を設定してください。decide_uncertified は、ポリシーを適用せずにモデルの生の回答を返します。

証明書は、重み、Torch のバージョン、デバイス、ハードウェアからなる特定の構成を対象とします。証明書に記載されていないハードウェアでは、最初の読み込み時にリリースの同等性テストセットを実行し、すべての決定が一致することを求めます。独自のラベル付きデータでしきい値を認証するには、次のようにします。

mimir calibrate labelled.jsonl --risk 0.01 --confidence 0.95 --out policy.json
model = Mimir.from_pretrained("Mythologic/MIMIR-1", policy="policy.json")

リモートでの使用

from mimir import MimirClient

remote = MimirClient("https://mimir.internal", api_key="...")
remote.choose(
    "Hi, we were billed twice for March. Please refund the duplicate today or we will cancel our plan.",
    "Which department should handle this request?",
    options={
        "billing": "Billing: invoices, payments, refunds",
        "technical": "Technical: bugs, outages, system errors",
        "sales": "Sales: pricing, new contracts",
        "other": "Other: everything else",
    },
)

MimirClient は Mimir と同じインターフェースを備えているため、すべてのコード、決定ツール、フレームワークアダプターでどちらも使用できます。必要なのは基本インストールのみです。接続エラー、タイムアウト、および 429/502/503/504/529 の応答は、Retry-After に従う指数バックオフで再試行されます。


決定ツール

from mimir import Choice

route_ticket = model.tool(
    "route_ticket",
    Choice(
        "Which department should handle this request?",
        {
            "billing": "Billing: invoices, payments, refunds",
            "technical": "Technical: bugs, outages, system errors",
            "sales": "Sales: pricing, new contracts",
            "other": "Other: everything else",
        },
    ),
    description="Route a support ticket to the team that owns it.",
)
route_ticket(
    "Hi, we were billed twice for March. Please refund the duplicate today or we will cancel our plan."
)
route_ticket.input_schema, route_ticket.output_schema

ツールは YAML ファイルでも宣言でき、HTTP サーバーと MCP サーバーが読み込みます。

tools:
  - name: route_ticket
    description: Route a support ticket to the team that owns it.
    decision:
      type: choice
      question: Which department should handle this request?
      options:
        billing: "Billing: invoices, payments, refunds"
        technical: "Technical: bugs, outages, system errors"
        sales: "Sales: pricing, new contracts"
        other: "Other: everything else"

ツール呼び出しのチェック

ツール呼び出しのチェックでは、作成したルールに照らして、エージェントが保留中のツール呼び出しを実行してよいかを判断します。確信度の高い「はい」なら実行を許可し、確信度の高い「いいえ」なら拒否し、それ以外の場合は担当者に判断を委ねます。

check = model.tool_call_check(
    ["Refunds above 500 dollars need a manager's approval."], tools=["issue_refund"]
)
outcome = check("issue_refund", {"order": "4412", "amount": 900})
outcome.permission    # Permission.ALLOW, Permission.DENY or Permission.ESCALATE
outcome.reason        # one sentence for the agent or the approver

ベンチマーク

benchmarks/mimir_vs_laya_enterprise_benchmark.ipynb(Colab で実行)では、ポリシーの記述と保留中のツール呼び出しからなる 10 個のシナリオを実行します。正当なものが 5 件、ポリシーに違反するものが 5 件です。すべてのシステムに同じプロンプト、ツール、引数、ポリシーのテキストを与えます。記録された実行環境:Colab CPU、mimir-decisions 1.2.0、laya 0.4.0。

システム正解数実行されたポリシー違反の呼び出し(5 件中)実行された正当な呼び出し(5 件中)レイテンシの中央値
Laya、ルーターのみ4/10541,988 ms
Laya、ルーター + noul ゲート6/10124,556 ms
MIMIR-1、pick + tool_call_check9/100410,076 ms

このスイートは MIMIR の作者が作成した 10 個のシナリオで構成されるため、ここに示す数値は一般的な割合ではなく、このスイートでの結果を表します。MIMIR-1 では pick の段階で 4 件がエスカレーションされました。ポリシーチェックでは許可または拒否が判断され、ルーターが要求されたツールにルーティングした 2 件の違反呼び出し(4B と 5B)は拒否されました。MIMIR-1 は threshold モードの 0.50 で実行されました。レイテンシは、決定ごとにモデルを 2 回実行した Colab CPU のランタイムでの値です。

benchmarks/sysone-bench には、独立した sysone-bench スイートでの実行記録があります。


エージェントフレームワーク

各アダプターは、判断ツールをフレームワーク固有のネイティブなツール型に変換し、そのフレームワーク独自の承認フックにツール呼び出しチェックを組み込みます。

フレームワークインストールツールツール呼び出しチェック
OpenAI Agents SDKmimir-decisions[openai-agents]as_function_toolguard:エスカレーション時は承認のため実行を一時停止します
LangChain / LangGraphmimir-decisions[langchain]as_structured_toolToolCallCheckMiddleware:エスカレーション時は、human-in-the-loop リクエストで中断します
PydanticAImimir-decisions[pydantic-ai]as_toolsetguard:エスカレーション時は DeferredToolRequests を返して実行を終了します
CrewAImimir-decisions[crewai]as_crewai_tooltool_call_hook:エスカレーションは承認者に送られます
Google ADKmimir-decisions[adk]as_adk_tooltool_call_callback:エスカレーション時は ADK の確認を求めます
Microsoft Agent Frameworkmimir-decisions[agent-framework]as_function_toolToolCallCheckMiddleware:確信度の高い呼び出しのみ実行されます
LlamaIndexmimir-decisions[llamaindex]as_llamaindex_toolなし
smolagentsmimir-decisions[smolagents]as_smolagents_toolなし
from agents import Agent
from mimir.integrations.openai_agents import as_function_tool

agent = Agent(name="support", tools=[as_function_tool(route_ticket)])

すべてのフレームワークは、それぞれ独自の MCP クライアントを通じて MIMIR に接続します。examples/ には、各フレームワーク向けのネイティブ、MCP、チェック付きのエージェントに加え、TypeScript の Vercel AI SDK エージェントもあります。


HTTP サーバー

pip install "mimir-decisions[local,server]"
MIMIR_API_KEYS=key-one,key-two mimir serve --host 0.0.0.0 --tools tools.yaml
ルート内容
POST /v1/decide1 件の判断:{context, decision, mode, min_confidence, risk, alpha}
POST /v1/decide/uncertifiedモデルの未加工の回答:{context, decision}
POST /v1/decide/batch1 回の呼び出しで最大 64 件の判断
POST /v1/tools/{name}--tools のツール。{context} のみを受け取ります
POST /v1/systemoneJev のリクエストおよびレスポンス形式
GET /v1/modelsモデル、リビジョン、ランタイム、認定済みリスクレベル
GET /healthz、GET /readyz生存状態、およびモデル読み込み後の準備状態
GET /metricsPrometheus メトリクス

同時リクエストはバッチ処理されます。MIMIR_API_KEYS にキーが設定されている場合、プローブを除くすべてのルートで Authorization: Bearer <key> が必要です。キーが設定されていないサーバーは、--allow-no-auth を指定して起動しない限り、ループバックインターフェースのみでリッスンします。OpenAPI 3.1 ドキュメントは openapi.json です。


MCP サーバー

設定された各ツールは、コンテキストのみを受け取る MCP ツールになります。--generic-tools を指定すると、mimir_choose、mimir_verify、mimir_rank、mimir_rate が追加されます。遅延された判断は、エージェントにエスカレーションを指示する通常の結果です。

uvx --from "mimir-decisions[local,mcp]" mimir-decisions mcp --tools tools.yaml               # stdio
MIMIR_API_KEYS=... mimir mcp --http --host 0.0.0.0 --tools tools.yaml       # Streamable HTTP at /mcp
mimir mcp --tools tools.yaml --remote https://mimir.internal                  # forward to a server
mimir serve --mcp --tools tools.yaml                                          # HTTP API and /mcp together

Claude Code では:

claude mcp add mimir -- uvx --from "mimir-decisions[local,mcp]" mimir-decisions mcp --tools /path/to/tools.yaml
claude mcp add --transport http mimir https://mimir.internal/mcp --header "Authorization: Bearer ..."

Claude Desktop、Cursor、VS Code では、MCP 設定に同じコマンド、または同じ URL とヘッダーを指定します。このサーバーは MCP Registry に io.github.abderahmane-ai/mimir として登録されています。


コンテナー

docker run -p 8000:8000 -e MIMIR_API_KEYS=... -v mimir-models:/models ghcr.io/abderahmane-ai/mimir:1.2.0-cpu
docker run --gpus all -p 8000:8000 -e MIMIR_API_KEYS=... -v mimir-models:/models ghcr.io/abderahmane-ai/mimir:1.2.0-cuda

イメージにはランタイムが含まれますが、モデルの重みは含まれません。初回起動時に、パッケージのバージョンで固定されたリビジョンのモデルがダウンロードされ、検証されたうえで /models にキャッシュされます。そのキャッシュからネットワーク接続なしで実行するには、serve --host 0.0.0.0 --model-cache /models --offline を追加します。

イメージはリリースワークフローによって Sigstore で署名されます:

cosign verify ghcr.io/abderahmane-ai/mimir:1.2.0-cpu \
  --certificate-identity https://github.com/abderahmane-ai/mimir/.github/workflows/release.yml@refs/heads/main \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

コマンドライン

コマンド説明
mimir serveHTTP サーバー。--mcp を指定すると、/mcp で MCP も提供します
mimir mcp標準入出力経由、または --http を指定して MCP サーバーを起動します
mimir decideフラグから 1 件の判断を行うか、標準入力から JSON リクエストを受け取ります
mimir bench FILEラベル付き判断の精度、カバレッジ、認定済み割合、実現リスクを測定します
mimir calibrate FILEラベル付き判断に基づいてしきい値を認定します
mimir schemaすべての仕様、結果、リクエストの JSON スキーマ
mimir downloadオフライン利用向けにリリースをダウンロードして検証します
mimir doctor環境を報告します。--verify を指定すると、モデルを読み込んで同等性チェックを実行します

整合性

リリースは、固定された Hugging Face のリビジョンから読み込まれます。モデルファイルを読み込む前に、マニフェストの Sigstore 署名が abderahmane-ai/mimir のリリースワークフローに対して検証され、すべてのファイルがマニフェストの SHA-256 と照合されます。pickle は一切使用しません。


移行

mimir.compat.systemone.v1 は Jev /v1/systemone のリクエストとレスポンスを変換し、mimir.compat.laya.v1 は Laya 0.3.20 の形式で load(...).predict(state, questions) を提供します。手順については、移行ガイドをご覧ください。


ライセンス

MIMIR SDK は Apache-2.0 でライセンスされています。このライセンスの対象はソフトウェアのみであり、 MIMIR のモデルウェイトは対象外です。MIMIR-1 のモデルウェイトは、別途 MIMIR Model License に基づいてライセンスされています。

条件を満たすコミュニティユーザーは、MIMIR Model License に従い、ロイヤリティなしで MIMIR-1 を商用利用できます。 登録なしで、誰でも MIMIR をダウンロード、ベンチマーク、評価、プロトタイプ作成に利用できます。

収益基準(年間総収益 1,000,000 米ドル)を超える組織、またはエンタープライズ、OEM、再配布、ホスティング、 その他の追加権利を必要とする組織は、Mythologic から商用契約を取得できます。COMMERCIAL-LICENSING.md をご覧ください。

コメント

MCP は初めてですか?

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

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