mcpField
D
decisionmatrix-mcp

decisionmatrix-mcp

リモート
github.com/inity13AI・エージェント01 週間前に更新
リポジトリ

decisionmatrix-mcp について

decisionmatrix-mcpは、LLMエージェント向けの決定論的な多基準意思決定分析エンジンです。重み付き基準で選択肢を採点・順位付けし、3種類の手法による精密な結果と基準別の説明を返します。

主な機能

  1. 01選択肢の採点と順位付け
  2. 023種類の採点手法
  3. 03基準ごとの結果内訳
  4. 04感度分析と二者比較
  5. 05決定論的な40桁精度計算
  6. 06構造化された結果とエラー

活用シーン

  1. 01重み付き基準でベンダーを比較
  2. 02重みの変化に対する順位の頑健性を確認
  3. 032つの選択肢を基準ごとに比較

MCP 対応

Streamable HTTPまたはローカルstdioを通じて、意思決定分析と探索の6つのツールをMCPクライアントに公開します。ホスト型またはセルフホストで運用できます。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://decisionmatrix-mcp.pages.dev/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
npmdecisionmatrix-mcp1.0.2

ツール

6
パラメーター型必須説明
methodenumいいえweighted_sum | weighted_product | topsis
scoresobjectはいスコア行列。オブジェクト形式:{"Option A": {"Criterion 1": 8, ...}, ...}。配列形式:[{"option":"Option A","scores":{...}}]。各オプションオブジェクトに scores をインラインで指定することもできます。
optionsarrayはい名前付きの選択肢。文字列 ["A","B"] またはオブジェクト [{"name":"A","scores":{...}}]。
criteriaarrayはい加重基準。各項目の形式:{name, weight(相対値、>=0), direction: 'benefit'(高いほど良い、既定) | 'cost'(低いほど良い)}。

詳細

DecisionMatrix MCP

LLM エージェントに信頼性の高い多基準意思決定分析(MCDA)エンジンを提供する、透明性の高い100%決定論的なModel Context Protocol(MCP)サーバーです。

エージェントは選択肢を集めるのは得意ですが、それらを評価することは苦手です。精度が落ち、重み付けに一貫性がなく、判断の根拠も示せません。DecisionMatrix はスコアリングを、正確で説明可能なエンジンに任せます。選択肢と重み付けした基準(およびスコアマトリクス)を指定すると、基準ごとの内訳、使用した手法、適用した重み、平易な説明とともに、完全にスコア付け・順位付けされ、説明も付いた結果を返します。

すべての数値は decimal.js を使って40桁の精度で処理されるため(浮動小数点数は一切使いません)、同じ入力からは常にバイト単位で同一の出力が生成されます。サーバーはステートレスです。データベースもセッションもありません。

🌐 稼働中のホストサーバー(無料、インストール不要)

Cloudflare のエッジ上でパブリックなリモート MCP サーバーが稼働しています。Streamable-HTTP 対応の MCP クライアントから接続してください。

https://decisionmatrix-mcp.pages.dev/mcp
{ "mcpServers": { "decisionmatrix": {
    "type": "http", "url": "https://decisionmatrix-mcp.pages.dev/mcp" } } }

無料プランではオープンモードで稼働します(キー不要、1 IP あたり1日15回)。有料プラン(Starter $12/mo · 5,000/day、Pro $39/mo · 50,000/day)は Stripe Checkout で利用できます。プランを購入すると、すぐに API キーが発行されます。キーは X-API-Key として送信してください。キーなしで無制限に利用するには、セルフホストしてください。ランディングページと料金プラン:https://decisionmatrix-mcp.pages.dev。


機能

6つのツールがあり、すべて統一された、エージェントが解析しやすい形式のレスポンスを返します。

ツール用途
create_decisionメインツール。 重み付けした基準に照らして選択肢を順位付けします → 最有力候補、全順位、基準ごとの内訳、手法、重み、平易な説明を返します。
score_optionsスコアが別途指定されている場合に、正規化済みのスコアマトリクス全体を返します。
sensitivity_analysis各基準の重みを±X%変動させ、最有力候補の順位がどれほど頑健か(および順位が入れ替わる条件)を報告します。
compare_twoちょうど2つの選択肢を直接比較し、基準ごとの勝利数を返します。
list_methods利用可能なスコアリング手法と、それぞれの使用場面を確認できます。
health_checkバージョン、ステータス、機能を返します。
スコアリング手法
methodmodelnormalizationnotes
weighted_sum (default)単純加重和(SAW)基準ごとの最小値・最大値による正規化最も透明性が高く、加算による寄与を確認できます。負の値にも対応します。
weighted_product加重積モデル(WPM)比率(x/max、min/x)いずれか1つの基準が低い場合に大きく評価を下げます。スコアは0より大きい必要があります。
topsis理想解への近さベクトル(ユークリッド)0~1の近接係数を返します。基準が多い場合にも有効です。

各基準には方向があります。benefit(高いほど良い — 品質、速度)または cost(低いほど良い — 価格、レイテンシ、リスク)を指定します。重みは相対値であり、内部で合計が1になるよう正規化されます。

一貫したレスポンス形式

成功したレスポンスには、status、method、winner、ranking (基準ごとのbreakdownを含む)、methodology、weights_used、inputs_used、 notes、および自然言語によるexplanationが含まれます。

{
  "status": "success",
  "method": "weighted_sum",
  "winner": { "option": "Gamma", "score": 0.666667, "score_exact": "0.666667", "rank": 1, "tie": false, "tied_with": [] },
  "ranking": [
    { "rank": 1, "option": "Gamma", "score": 0.666667, "score_exact": "0.666667",
      "breakdown": [
        { "criterion": "Price", "direction": "cost", "weight": 0.5, "weight_raw": "3",
          "raw_score": "900", "normalized_score": 1, "weighted_contribution": 0.5 }
      ] }
  ],
  "methodology": {
    "method": "weighted_sum",
    "name": "Weighted Sum Model (Simple Additive Weighting)",
    "normalization": "min-max per criterion (best value -> 1, worst -> 0)",
    "score_range": "0 to 1 (higher is better)",
    "weighting": "Criteria weights are normalized to sum to 1; only their relative sizes matter.",
    "deterministic": true
  },
  "weights_used": [ { "criterion": "Price", "direction": "cost", "weight_input": "3", "weight_normalized": 0.5 } ],
  "inputs_used": { "options": ["Alpha","Beta","Gamma"], "method": "weighted_sum", "option_count": 3, "criterion_count": 3 },
  "notes": [ "Scores are normalized within this option set; they express relative standing, not an absolute grade." ],
  "explanation": "Using the Weighted Sum Model, 'Gamma' ranks #1 with a score of 0.666667, ahead of 'Alpha' (0.527778) by 26.32% ..."
}

エラーが例外としてツール境界を越えることはありません。代わりに、構造化された、対処方法が分かる形式で返されます。

{
  "status": "error",
  "error": {
    "type": "incomplete_scores",
    "message": "Missing 1 score(s) in the options x criteria matrix.",
    "hint": "Provide a score for every option and criterion. Missing: Beta / Weight."
  }
}

設計上の注記 — 正確な数値: score は扱いやすいよう決定論的に丸めた数値(小数点以下6桁)です。score_exact / raw_score は精度を失わないよう、完全精度の文字列です。順位は正確な値を使って計算され、同点の場合は入力順が安定したタイブレーカーとして使われます。


プロジェクト構成

decisionmatrix-mcp/
├── worker-src/
│   ├── index.mjs        # Cloudflare Pages Function (_worker.js): MCP over Streamable HTTP + billing routes
│   ├── engine.mjs       # The deterministic MCDA engine: 3 methods + 6 tools + validation
│   └── billing.mjs      # Stripe Checkout + KV-backed API keys, quota metering, webhook
├── site/
│   ├── index.html       # Static landing / pricing / docs page
│   └── _worker.js        # Built bundle (esbuild output; git-ignored)
├── tests/
│   └── engine.test.mjs  # 21 core scoring-logic tests (node --test)
├── examples/
│   └── agent_example.mjs # End-to-end MCP client demo over HTTP
├── package.json         # build / deploy / dev / test scripts
├── wrangler.toml        # Cloudflare Pages config
├── .env.example         # Optional auth/rate-limit env reference
├── LICENSE              # MIT
└── README.md

関心事の分離: engine.mjs は純粋で、トランスポートに依存しません(テストや任意の Node/Deno/エッジランタイムから直接インポートできます)。index.mjs は MCP の JSON-RPC 接続処理、HTTP、CORS、および認証・利用量計測の境界のみを扱います。


要件

  • Node 18+(ビルド、テスト、ローカル開発に必要です)。開発時/実行時の依存関係は 2 つだけです: decimal.js(計算)と esbuild(バンドラー)。
  • ホスト版をデプロイするには Cloudflare アカウントが必要です(無料プランで問題ありません)。

ローカルで実行する

git clone <your-fork> decisionmatrix-mcp && cd decisionmatrix-mcp
npm install

# Run the test suite (no server needed)
npm test

# Serve the MCP endpoint locally via Wrangler (builds + runs Pages dev)
npm run dev          # -> http://127.0.0.1:8788/mcp

# Try the end-to-end client demo (hosted by default, or pass a local URL)
node examples/agent_example.mjs
node examples/agent_example.mjs http://127.0.0.1:8788

手動で呼び出す簡単な方法:

curl -s http://127.0.0.1:8788/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{
        "name":"list_methods","arguments":{}}}'

npm 経由でインストール(stdio、ホスティング不要)

サーバーをローカルで stdio 経由で実行できます。デプロイ不要で、コマンドは 1 つだけです:

npx -y decisionmatrix-mcp

Claude Desktop/任意の stdio MCP クライアント(claude_desktop_config.json):

{ "mcpServers": { "decisionmatrix": { "command": "npx", "args": ["-y", "decisionmatrix-mcp"] } } }

ホスト版サーバーと同じ決定論的エンジンを、お使いのマシン上で実行します。

クライアントの設定

Cursor — ~/.cursor/mcp.json
{ "mcpServers": { "decisionmatrix": {
    "url": "https://decisionmatrix-mcp.pages.dev/mcp" } } }
Claude Desktop — claude_desktop_config.json

Claude Desktop は stdio サーバーを起動するため、mcp-remote で HTTP エンドポイントにブリッジします:

{ "mcpServers": { "decisionmatrix": {
    "command": "npx", "args": ["-y", "mcp-remote", "https://decisionmatrix-mcp.pages.dev/mcp"] } } }
VS Code — .vscode/mcp.json
{ "servers": { "decisionmatrix": {
    "type": "http", "url": "https://decisionmatrix-mcp.pages.dev/mcp" } } }
任意の Streamable-HTTP MCP クライアント

https://decisionmatrix-mcp.pages.dev/mcp(またはセルフホスト URL)を指定します。認証を有効にしている場合は、クライアントの headers に X-API-Key(または Authorization: Bearer <key>)を追加してください。


ツールとパラメーター

create_decision(options, criteria, scores, method="weighted_sum")
  • options — 名前の配列(["Vendor A","Vendor B"])またはオブジェクト ([{"name":"Vendor A","scores":{...}}])。最小 2 件で、名前は一意である必要があります。
  • criteria — { "name", "weight" (>=0), "direction": "benefit"|"cost" } の配列。 少なくとも 1 つの重みは 0 より大きい必要があります。
  • scores — オプション×基準の行列。受け付ける形式:
    • オブジェクトマップ:{ "Vendor A": { "Price": 100, "Quality": 8 }, ... }
    • 配列:[ { "option": "Vendor A", "scores": { ... } }, ... ]
    • 各オプションオブジェクト内にインラインで指定。
  • method — weighted_sum(デフォルト) · weighted_product · topsis(saw、wpm、ideal などの別名も解決されます)。
score_options(options, criteria, scores, method)

create_decision と同じ入力を受け取り、勝者についての説明を含まずに、完全な採点済み行列(オプションごと・基準ごとの正規化スコアと合計)を返します。

sensitivity_analysis(options, criteria, scores, method, variation=0.2, steps=10)

各基準の重みを -variation から +variation まで(小数で指定。例:0.2 = ±20%)、steps 回の増分(2~100)で変化させ、ほかの重みを再正規化したうえで、毎回勝者を再計算します。robustness_score(ベースラインの勝者が 1 位を維持するシナリオの割合)、fragile_criteria、および基準ごとの順位逆転ポイントを返します。

compare_two(option_a, option_b, criteria, scores, method)

ちょうど 2 つのオプションを直接比較します(option_a/option_b の名前、または 2 要素の options 配列を渡します)。勝者、スコアの margin、criteria_wins、および各基準がどちらのオプションを「より優れている」と評価するかを示す per_criterion の内訳を返します。

list_methods() / health_check()

メソッドの一覧表示とステータス確認を行います。パラメーターはありません。


ツール呼び出しのペイロード例

ノート PC を選ぶ(価格と重量はコスト基準です):

{ "name": "create_decision", "arguments": {
  "options": ["Alpha", "Beta", "Gamma"],
  "criteria": [
    { "name": "Price",   "weight": 3, "direction": "cost" },
    { "name": "Battery", "weight": 2, "direction": "benefit" },
    { "name": "Weight",  "weight": 1, "direction": "cost" }
  ],
  "scores": {
    "Alpha": { "Price": 1000, "Battery": 8,  "Weight": 1.5 },
    "Beta":  { "Price": 1200, "Battery": 12, "Weight": 1.8 },
    "Gamma": { "Price": 900,  "Battery": 6,  "Weight": 1.2 }
  }
} }

勝者がどの程度頑健かをテストする:

{ "name": "sensitivity_analysis", "arguments": {
  "options": ["Alpha", "Beta", "Gamma"],
  "criteria": [
    { "name": "Price", "weight": 3, "direction": "cost" },
    { "name": "Battery", "weight": 2 }
  ],
  "scores": { "Alpha": {"Price":1000,"Battery":8}, "Beta": {"Price":1200,"Battery":12}, "Gamma": {"Price":900,"Battery":6} },
  "variation": 0.3, "steps": 8
} }

直接比較:

{ "name": "compare_two", "arguments": {
  "option_a": "Alpha", "option_b": "Beta",
  "criteria": [ { "name": "Price", "weight": 3, "direction": "cost" }, { "name": "Battery", "weight": 2 } ],
  "scores": { "Alpha": {"Price":1000,"Battery":8}, "Beta": {"Price":1200,"Battery":12} }
} }

Cloudflare Pages にデプロイする

PrecisionCalc と同じパターンです。1 回のビルドで worker-src/ を site/_worker.js(Pages の「advanced mode」Function)にバンドルし、その後 Wrangler で site/ ディレクトリをデプロイします。

npm install
npx wrangler login          # once

# Build + deploy in one shot
npm run deploy              # esbuild -> site/_worker.js, then wrangler pages deploy

または Git と連携します。Pages プロジェクトを作成し、ビルドコマンドに npm run build、出力ディレクトリに site を設定します。プッシュのたびに自動でデプロイされます。 compatibility_date とプロジェクト名は wrangler.toml に記載されています。

完全無料/プライベートで実行するには、バインディング、シークレット、環境変数は不要です。採点エンジンはステートレスで、サーバーはフェイルオープンで動作します(無料プラン、クォータ無効)。

課金の有効化(ホスト型サーバーではすでに稼働中)

ホスト型サーバーでは以下を使用しています。有料デプロイで利用する場合は、同じように設定してください。

  1. API キーと日次使用量カウンター用の KV 名前空間を作成し、wrangler.toml で DECISIONMATRIX_KV としてバインドします。
  2. Stripe の商品/価格(サブスクリプション)を設定し、価格 ID を [vars](PRICE_STARTER、PRICE_PRO)に、日次上限を FREE_DAILY、STARTER_DAILY、PRO_DAILY に設定します。
  3. Stripe のシークレット(リポジトリには絶対に含めないでください):
    wrangler pages secret put STRIPE_SECRET_KEY     --project-name decisionmatrix-mcp
    wrangler pages secret put STRIPE_WEBHOOK_SECRET  --project-name decisionmatrix-mcp
    
  4. Webhook → customer.subscription.updated と customer.subscription.deleted を対象に、https://<your-domain>/webhook で Stripe の Webhook エンドポイントを作成します。

接続されるルート:/checkout?plan=starter|pro → Stripe Checkout、/success は API キーを発行して表示(冪等)、/portal は Stripe の課金ポータルを開き、/webhook はサブスクリプションのライフサイクル(無効化/復元)を処理し、/metrics は使用量を報告します。


認証とレート制限

ホスト型サーバーは worker-src/billing.mjs で階層別のクォータを適用します。

  • ID — identify() は X-API-Key/Authorization: Bearer を読み取り、KV でキーを検索し、見つからない場合は IP ごとの無料プランにフォールバックします。
  • クォータ — consumeQuota() は KV の日次カウンターです(UTC 00:00 にリセット)。method === "tools/call" の場合に handleRpc 内でクォータを判定する唯一の箇所です。
  • ペイウォール応答 — クォータ超過、無効なキー、または失効したキーに対して、価格とチェックアウト URL を含む構造化された upsell エンベロープを返します(エージェントが読み取り、対応できます)。
  • 使用量の計測 — /metrics のインメモリカウンターで計測します。

DecisionMatrix には有料プラン限定のツールはありません。すべてのツールがすべてのプランで利用でき、有料プランでは日次クォータのみが増加します。ツールを有料プラン限定にするには、index.mjs の PAID_ONLY_TOOLS にその名前を追加してください。エンジンは純粋かつステートレスなため、スコアリングのロジックに影響はありません。


設計上の判断と前提

  • 設計上、決定論的です。 40 桁の十進演算、すべての箇所での ROUND_HALF_UP、および入力順に基づく安定した同点判定を採用しています。浮動小数点数、乱数、結果に影響する時計は使用しません。
  • 正規化は評価基準ごとに行い、方向も考慮します。 weighted_sum は最小最大正規化(最良→1、最悪→0)を使用します。すべての選択肢で評価基準の値が同じ場合は中立として扱い(正規化値を1にし)、その旨を記録します。weighted_product は比率正規化を使用し、スコアが厳密に正であることを要求します(そうでない場合は明確なエラーを返します)。topsis はベクトル正規化を使用し、理想解/反理想解への近さに基づいて順位付けします。
  • 重みは相対値です — 合計が1になるように正規化するため、[3,2,1] と [30,20,10] では同じ結果になります。
  • スコアは選択肢の集合に対する相対値です — 絶対的な評価ではなく、指定された代替案の中での順位を示します。この点は notes に記載されています。
  • エラーは例外ではなくデータです — 各ツールは、機械可読な type と具体的な対処方法を示す hint を含む status:"error" を返します。検証では、名前の重複、欠損セル(対象を正確に列挙)、数値以外のスコア、不正な重み/方向、未知のメソッドをチェックします。
  • ステートレスで副作用がありません — 簡単にキャッシュでき、水平方向にスケーリングでき、どこでも安全に実行できます(Cloudflare、Node、Deno、Bun)。

テスト

npm test          # node --test tests/*.test.mjs  (21 tests, no network)

テストスイートでは、手計算で検証できる weighted_sum の算術を固定し、決定性、重みの相対性、方向の処理、同点、3 つすべてのメソッド、compare_two、sensitivity_analysis、複数のスコア入力形式、およびすべてのエラーケースをチェックします。


ロードマップ(MVP 後)

  1. メソッドの追加:AHP(ペアワイズ比較による重みの設定)、ELECTRE、PROMETHEE、ボルダ集計。
  2. 集団意思決定:複数のステークホルダーの重み/スコアの組み合わせを集約します。
  3. 一度に1つずつ変更する手法に加え、モンテカルロ感度分析(すべての重みを同時に変動させる手法)。
  4. キーごとの使用量ダッシュボードと、より強い整合性を実現する Redis/Durable Object のクォータ。
  5. npm パッケージの公開と、ホスト型のマルチテナントプラン。

ライセンス

MIT — LICENSE を参照してください。

コメント

MCP は初めてですか?

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

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