Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Deterministic multi-criteria decision analysis for AI agents — score, rank & explain options.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
适用于网页版、桌面版和手机版 Claude:
https://decisionmatrix-mcp.pages.dev/mcp打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"decisionmatrix": {
"command": "npx",
"args": [
"-y",
"decisionmatrix-mcp"
]
}
}
}在终端中运行这条命令
claude mcp add --transport http decisionmatrix https://decisionmatrix-mcp.pages.dev/mcpclaude mcp add decisionmatrix -- npx -y decisionmatrix-mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"decisionmatrix": {
"url": "https://decisionmatrix-mcp.pages.dev/mcp"
}
}
}粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"decisionmatrix": {
"command": "npx",
"args": [
"-y",
"decisionmatrix-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"decisionmatrix": {
"type": "http",
"url": "https://decisionmatrix-mcp.pages.dev/mcp"
}
}
}粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"decisionmatrix": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"decisionmatrix-mcp"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
ChatGPT 只能连接互联网上的服务器:
https://decisionmatrix-mcp.pages.dev/mcp菜单名称可能因套餐和版本不同而略有差异。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
我们还没有读取这个服务器的工具列表;我们会轮流检查各个端点。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月6日
注册名称已通过 GitHub 账户 inity13 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
尚未检查;我们会轮流检查各个端点
尚未检查;我们会轮流检查各个端点
尚未检查;我们会在检查端点时读取工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
两种方式都可以:安装在你的电脑上,或者连接云端版本。
GitHub 仓库最后更新于–,最新版本(1.0.2)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:Spec Driven Development, Remote Desktop Commander, HotCodePush
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Manage over-the-air (OTA) updates for React Native, Expo, Capacitor and Cordova apps.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A transparent, 100% deterministic Model Context Protocol (MCP) server that gives LLM agents a reliable multi-criteria decision analysis (MCDA) engine.
Agents are great at gathering options but unreliable at *weighing* them: they lose precision, apply inconsistent weights, and can't show their work. DecisionMatrix offloads the scoring to an exact, explainable engine. You provide options and weighted criteria (plus a score matrix); it returns a fully scored, ranked, and explained result — with per-criterion breakdowns, the methodology used, the weights applied, and a plain-language explanation.
Every number flows through decimal.js at 40-digit precision (never floats), so identical inputs always produce byte-identical output. The server is stateless — no database, no sessions.
A public remote MCP server runs on Cloudflare's edge — point any Streamable-HTTP MCP client at it:
https://decisionmatrix-mcp.pages.dev/mcp
{ "mcpServers": { "decisionmatrix": {
"type": "http", "url": "https://decisionmatrix-mcp.pages.dev/mcp" } } }
It runs in open mode on the free tier (no key, 15 calls/day per IP). Paid plans (Starter $12/mo · 5,000/day, Pro $39/mo · 50,000/day) are live via Stripe Checkout — buy a plan, get an API key instantly, and send it as X-API-Key. Self-host for unlimited calls with no keys. Landing page + pricing: https://decisionmatrix-mcp.pages.dev.
Six tools, all returning a uniform, agent-parseable envelope:
| Tool | Purpose |
|---|---|
create_decision | Main tool. Rank options against weighted criteria → winner, full ranking, per-criterion breakdowns, methodology, weights, and a plain-language explanation. |
score_options | Return the full normalized scored matrix when scores are supplied separately. |
sensitivity_analysis | Sweep each criterion's weight ±X% and report how robust the winner is (and where it flips). |
compare_two | Head-to-head comparison of exactly two options with per-criterion win counts. |
list_methods | Discovery: available scoring methods and when to use each. |
health_check | Version, status, and capabilities. |
| method | model | normalization | notes |
|---|---|---|---|
weighted_sum *(default)* | Simple Additive Weighting (SAW) | min-max per criterion | Most transparent; additive contributions. Handles negatives. |
weighted_product | Weighted Product Model (WPM) | ratio (x/max, min/x) | Punishes any single weak criterion; requires scores > 0. |
topsis | Closeness to ideal solution | vector (Euclidean) | 0–1 closeness coefficient; robust with many criteria. |
Each criterion has a direction: benefit (higher is better — quality, speed) or cost (lower is better — price, latency, risk). Weights are relative; they are normalized to sum to 1 internally.
Every successful response contains: status, method, winner, ranking (with per-criterion breakdown), methodology, weights_used, inputs_used, notes, and a natural-language 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% ..." }
Errors never cross the tool boundary as exceptions — they come back as a structured, actionable envelope:
{
"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." } }
Design note — exact numbers:
scoreis a deterministically-rounded number (6 dp)
for easy consumption;
score_exact/raw_scoreare full-precision strings so no
precision is lost in JSON. Rankings are computed on the exact values, with input order
as a stable tie-break.
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
Separation of concerns: engine.mjs is pure and transport-agnostic (import it directly in tests or any Node/Deno/edge runtime); index.mjs only handles the MCP JSON-RPC wiring, HTTP, CORS, and the auth/metering seam.
decimal.js (math) and esbuild (bundler).git clone <your-fork> decisionmatrix-mcp && cd decisionmatrix-mcp
npm install
npm test
npm run dev # -> http://127.0.0.1:8788/mcp
node examples/agent_example.mjs node examples/agent_example.mjs http://127.0.0.1:8788
Quick manual call:
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":{}}}'
Run the server locally over stdio with a single command — nothing to deploy:
npx -y decisionmatrix-mcp
Claude Desktop / any stdio MCP client (claude_desktop_config.json):
{ "mcpServers": { "decisionmatrix": { "command": "npx", "args": ["-y", "decisionmatrix-mcp"] } } }
This is the same deterministic engine as the hosted server, running on your machine.
~/.cursor/mcp.json{ "mcpServers": { "decisionmatrix": {
"url": "https://decisionmatrix-mcp.pages.dev/mcp" } } }
claude_desktop_config.jsonClaude Desktop launches stdio servers, so bridge to the HTTP endpoint with mcp-remote:
{ "mcpServers": { "decisionmatrix": {
"command": "npx", "args": ["-y", "mcp-remote", "https://decisionmatrix-mcp.pages.dev/mcp"] } } }
.vscode/mcp.json{ "servers": { "decisionmatrix": {
"type": "http", "url": "https://decisionmatrix-mcp.pages.dev/mcp" } } }
Point it at https://decisionmatrix-mcp.pages.dev/mcp (or your self-hosted URL). If you enable auth, add X-API-Key (or Authorization: Bearer ) in the client's headers.
create_decision(options, criteria, scores, method="weighted_sum")["Vendor A","Vendor B"]) or objects ([{"name":"Vendor A","scores":{...}}]). Minimum 2, names unique.{ "name", "weight" (>=0), "direction": "benefit"|"cost" }. At least one weight must be > 0.{ "Vendor A": { "Price": 100, "Quality": 8 }, ... }[ { "option": "Vendor A", "scores": { ... } }, ... ]weighted_sum (default) · weighted_product · topsis (aliases like saw, wpm, ideal also resolve).score_options(options, criteria, scores, method)Same inputs as create_decision; returns the full scored matrix (per-option, per-criterion normalized scores + totals) without the winner narrative.
sensitivity_analysis(options, criteria, scores, method, variation=0.2, steps=10)Sweeps each criterion's weight from -variation to +variation (fractional, e.g. 0.2 = ±20%) in steps increments (2–100), renormalizing the others, and recomputes the winner each time. Returns a robustness_score (share of scenarios the baseline winner stays #1), the fragile_criteria, and per-criterion flip points.
compare_two(option_a, option_b, criteria, scores, method)Head-to-head between exactly two options (pass option_a/option_b names, or a 2-element options array). Returns the winner, score margin, criteria_wins, and a per_criterion breakdown showing which option each criterion favours.
list_methods() / health_check()Discovery + status. No parameters.
Choose a laptop (price & weight are cost criteria):
{ "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 } } } }
Test how robust the winner is:
{ "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 } }
Head-to-head:
{ "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} } } }
Same pattern as PrecisionCalc — one build step bundles worker-src/ into site/_worker.js (Pages "advanced mode" Function), then Wrangler deploys the site/ directory.
npm install
npx wrangler login # once
只显示了开头部分;其余内容请在仓库中阅读