decisionmatrix-mcp について
decisionmatrix-mcpは、LLMエージェント向けの決定論的な多基準意思決定分析エンジンです。重み付き基準で選択肢を採点・順位付けし、3種類の手法による精密な結果と基準別の説明を返します。
主な機能
- 01選択肢の採点と順位付け
- 023種類の採点手法
- 03基準ごとの結果内訳
- 04感度分析と二者比較
- 05決定論的な40桁精度計算
- 06構造化された結果とエラー
活用シーン
- 01重み付き基準でベンダーを比較
- 02重みの変化に対する順位の頑健性を確認
- 032つの選択肢を基準ごとに比較
MCP 対応
Streamable HTTPまたはローカルstdioを通じて、意思決定分析と探索の6つのツールをMCPクライアントに公開します。ホスト型またはセルフホストで運用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://decisionmatrix-mcp.pages.dev/mcpclaude mcp add --transport http inity13-decisionmatrix https://decisionmatrix-mcp.pages.dev/mcp{"mcpServers":{"inity13-decisionmatrix":{"type":"http","url":"https://decisionmatrix-mcp.pages.dev/mcp"}}}Cursor で開く{"servers":{"inity13-decisionmatrix":{"type":"http","url":"https://decisionmatrix-mcp.pages.dev/mcp"}}}VS Code で開く{"mcpServers":{"inity13-decisionmatrix":{"type":"http","url":"https://decisionmatrix-mcp.pages.dev/mcp"}}}{"mcpServers":{"inity13-decisionmatrix":{"serverUrl":"https://decisionmatrix-mcp.pages.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
6| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| method | enum | いいえ | weighted_sum | weighted_product | topsis |
| scores | object | はい | スコア行列。オブジェクト形式:{"Option A": {"Criterion 1": 8, ...}, ...}。配列形式:[{"option":"Option A","scores":{...}}]。各オプションオブジェクトに scores をインラインで指定することもできます。 |
| options | array | はい | 名前付きの選択肢。文字列 ["A","B"] またはオブジェクト [{"name":"A","scores":{...}}]。 |
| criteria | array | はい | 加重基準。各項目の形式:{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 | バージョン、ステータス、機能を返します。 |
スコアリング手法
| method | model | normalization | notes |
|---|---|---|---|
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 に記載されています。
完全無料/プライベートで実行するには、バインディング、シークレット、環境変数は不要です。採点エンジンはステートレスで、サーバーはフェイルオープンで動作します(無料プラン、クォータ無効)。
課金の有効化(ホスト型サーバーではすでに稼働中)
ホスト型サーバーでは以下を使用しています。有料デプロイで利用する場合は、同じように設定してください。
- API キーと日次使用量カウンター用の KV 名前空間を作成し、
wrangler.tomlでDECISIONMATRIX_KVとしてバインドします。 - Stripe の商品/価格(サブスクリプション)を設定し、価格 ID を
[vars](PRICE_STARTER、PRICE_PRO)に、日次上限をFREE_DAILY、STARTER_DAILY、PRO_DAILYに設定します。 - Stripe のシークレット(リポジトリには絶対に含めないでください):
wrangler pages secret put STRIPE_SECRET_KEY --project-name decisionmatrix-mcp wrangler pages secret put STRIPE_WEBHOOK_SECRET --project-name decisionmatrix-mcp - 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 後)
- メソッドの追加:AHP(ペアワイズ比較による重みの設定)、ELECTRE、PROMETHEE、ボルダ集計。
- 集団意思決定:複数のステークホルダーの重み/スコアの組み合わせを集約します。
- 一度に1つずつ変更する手法に加え、モンテカルロ感度分析(すべての重みを同時に変動させる手法)。
- キーごとの使用量ダッシュボードと、より強い整合性を実現する Redis/Durable Object のクォータ。
- npm パッケージの公開と、ホスト型のマルチテナントプラン。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。