Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Local Laya and Von typed decisions over TypeSafe-compatible MCP.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"decidealot": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/psyb0t/decidealot:v0.7.1"
]
}
}
}在终端中运行这条命令
claude mcp add decidealot -- docker run -i --rm docker.io/psyb0t/decidealot:v0.7.1粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"decidealot": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/psyb0t/decidealot:v0.7.1"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"decidealot": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/psyb0t/decidealot:v0.7.1"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 psyb0t 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.7.1)于31天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Docker。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Draugr
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ 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.
Security scanning for AI agents: SAST, SCA, secrets, IaC, DAST, ranked by real risk.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Your hardware or TypeSafe's hosted Jev. Run Laya, Von, a CLM projection head, or Jev through one TypeSafe-compatible HTTP and MCP endpoint.
At startup Decidealot downloads and verifies every enabled local bundle. It then loads only the provider selected by a request, unloads it after the configured idle period, and returns typed choice, score, and noul answers with model probabilities. CLM adds a small local projection head over one configured Qwen3-8B embeddings endpoint. It exposes the TypeSafe HTTP API and MCP Streamable HTTP from the same local container.
You need Docker. This starts the CPU image on loopback, stores downloaded model files in one narrow host directory, and gives the container no capabilities or writable root filesystem.
model_directory="$HOME/.local/share/decidealot/models"
runtime_uid=$(id -u) runtime_gid=$(id -g) mkdir --parents "$model_directory"
docker run --detach --name decidealot --init --restart unless-stopped \ --user "$runtime_uid:$runtime_gid" \ --read-only --cap-drop ALL --security-opt no-new-privileges:true \ --pids-limit 512 --memory 8g --cpus 4 \ --tmpfs /tmp:rw,noexec,nosuid,size=128m \ --tmpfs /var/run:rw,noexec,nosuid,size=8m \ --log-driver json-file --log-opt max-size=10m --log-opt max-file=5 \ --mount type=bind,source="$model_directory",target=/models \ --publish 127.0.0.1:8080:8080 \ psyb0t/decidealot:latest
Check the service, then ask Laya to make one typed decision:
curl --fail http://127.0.0.1:8080/health
curl --fail http://127.0.0.1:8080/v1/systemone \ --header 'Content-Type: application/json' \ --data '{ "model": "laya", "state": "A proposed action would permanently delete protected data.", "questions": { "handling": { "type": "choice", "instructions": "Choose the required handling for this action.", "criteria": { "allow": "The action is reversible and does not affect protected data.", "require_review": "The action is irreversible or affects protected data." } } } }'
The first service startup downloads the enabled pinned model bundles and can take several minutes. The default configuration enables Laya and Von. Wait for /health before sending a decision. Later service starts reuse the same host directory.
An example response looks like this. The answer, probabilities, and token count vary with the model call:
{
"model": "laya", "answers": { "handling": { "type": "choice", "choice": "require_review", "confidence": 0.94, "probabilities": {"allow": 0.06, "require_review": 0.94} } }, "usage": {"input_tokens": 91, "output_tokens": 0} }
For that result, your application queues the action for human review instead of running it. Decidealot does not perform the action. Your caller checks the chosen label and applies its own probability threshold, for example allowing an action only when choice is allow and probabilities.allow is at least 0.95.
Set DECIDEALOT_TYPESAFE_API_KEY in a private environment file or secret store. Jev enables automatically when the key is present. Call GET /v1/models and select a hosted name returned by TypeSafe, such as jev-latest. Decidealot caches the authenticated TypeSafe catalog for 60 seconds and refreshes it on the next model-listing or hosted-model request after expiry. New hosted model names need no Decidealot release. It sends the complete state and questions to TypeSafe's fixed HTTPS API, not to a local model. The key never belongs in the request body, a tracked file, or a client-side application.
For a Jev-only container, disable all local models so startup downloads no model bundles. Pass the upstream key as an environment variable from your secret store, then use the same REST or MCP endpoint shown below:
docker run --detach --name decidealot --init --restart unless-stopped \
--read-only --cap-drop ALL --security-opt no-new-privileges:true \ --tmpfs /tmp:rw,noexec,nosuid,size=128m \ --env DECIDEALOT_TYPESAFE_API_KEY \ --env DECIDEALOT_LAYA_ENABLED=false \ --env DECIDEALOT_VON_ENABLED=false \ --publish 127.0.0.1:8080:8080 \ psyb0t/decidealot:latest
The variable must already be set in the shell or supplied by your container manager. GET /v1/models confirms which Jev selectors are enabled. The API guide has a complete request and response example. TypeSafe charges for its API calls; model probabilities still need your own action thresholds.
Send the state to judge and a bounded question. Decidealot returns typed results with probabilities.
| Endpoint | What it does |
|---|---|
POST /v1/systemone | Runs the selected local model or hosted Jev against state and returns typed answers. |
POST /v1/systemone/batch | Runs independent System One requests and returns an ordered results list. |
GET /v1/models | Lists every supported alias and the model behind it. |
POST /v1/models/unload | Stops loaded local providers; hosted Jev is unaffected. |
/mcp | MCP Streamable HTTP, with system_one, system_one_batch, list_models, and unload_models tools. |
GET /health | Reports whether configured local bundles are ready. Jev-only startup has no bundle download. |
choice questions need named criteria. score questions need an ordered criteria array whose position is the score. noul questions return a probability between zero and one. The API guide has the request rules, response shape, validation failures, aliases, authentication, and lifecycle behavior.
Put the subject in state, the question and decision rules in each question's instructions, and explicit descriptions in criteria. A label like review does not explain what should be reviewed. For noul, write the statement whose probability you want in instructions.
CLM accepts optional flat request configuration. The selected model already identifies which settings apply:
{
"model": "clm", "config": {"temperature": 0.8}, "state": "The operation permanently removes protected data.", "questions": { "review": { "type": "noul", "instructions": "This operation requires human review because it removes protected data." } } }
CLM temperature defaults to 1 and accepts finite numbers greater than 0 and at most 100. Lower values sharpen its probability distribution; they do not make the answer more correct. Laya, Von, and hosted Jev currently accept only omitted or empty config. Unsupported keys and values return 422, never silently disappear. The same config belongs in MCP tool arguments or each individual batch request. Request configuration covers the contract.
The same container serves MCP Streamable HTTP at http://127.0.0.1:8080/mcp. The system_one tool takes the same model, state, and questions fields as POST /v1/systemone. system_one_batch takes a requests list, each item with those same fields. list_models returns the live catalog. unload_models releases local model memory. Direct loopback clients and containers using the decidealot Docker service name work by default.
Point an MCP client at that exact URL. Its configuration format varies, but the connection values are always equivalent to this:
{
"mcpServers": { "decidealot": { "url": "http://127.0.0.1:8080/mcp", "headers": { "Authorization": "Bearer your-token-here" } } } }
Omit the Authorization header only when DECIDEALOT_API_KEY is empty. The MCP tools return structured output matching the HTTP result bodies, so an agent can inspect probabilities before it chooses the next action. A client that only supports local stdio can use the optional OpenClaw bridge described in Agent integrations. The API guide has tool inputs, output shapes, session behavior, and failure behavior.
The MCP server keeps DNS-rebinding protection enabled. A proxy, tunnel, or public DNS name must be allowed explicitly. Add the exact public Host value to DECIDEALOT_MCP_ALLOWED_HOSTS. Browser-based MCP clients must also add their exact origin, including the scheme, to DECIDEALOT_MCP_ALLOWED_ORIGINS.
For a proxy that publishes https://mcp.example.net/mcp, put these values in the Compose .env file before docker compose up -d, or pass the same variables with docker run --env:
DECIDEALOT_API_KEY=replace-with-a-real-secret
DECIDEALOT_MCP_ALLOWED_HOSTS=127.0.0.1,127.0.0.1:*,localhost,localhost:*,[::1],[::1]:*,decidealot,decidealot:*,mcp.example.net DECIDEALOT_MCP_ALLOWED_ORIGINS=http://127.0.0.1:*,http://localhost:*,http://[::1]:*,https://mcp.example.net
Keep --publish 127.0.0.1:8080:8080 when a local reverse proxy terminates TLS. The proxy forwards the request unchanged with Host: mcp.example.net. After bearer authentication, Decidealot returns 421 for an untrusted host and 403 for an untrusted browser origin. Invalid or missing bearer credentials return 401 first. Do not disable this protection or allow a broad wildcard for an internet-facing endpoint.
Every request must name a selector. GET /v1/models returns the same catalog at runtime.
| Selector | What it runs | Pick it when |
|---|---|---|
laya, laya-auto, laya-latest | Laya with automatic checkpoint routing. | State may arrive in more than one language or script. |
laya-english | Laya's English checkpoint. | State is English and uses the Latin script. |
laya-multilingual | Laya's multilingual checkpoint. | State is in another language or script, including short Latin-script text that is not clearly English. |
laya-typed-decisions | Laya's checkpoint tuned for structured workflow decisions. | Your workload looks like repeated policy, routing, triage, or approval decisions. Validate it on your own cases first. |
von, von-latest, von-1.1, von-1.1.0 | The local English-only Von 1.1 model. | You want Von's independent result for a short, well-posed decision, or want to compare it with Laya before standardizing a workflow. |
clm, clm-latest, clm-0.1, clm-0.1-8b | The local CLM v0.1 projection head over one configured Qwen3-8B embeddings endpoint. | You have a trusted embeddings service that emits CLM-compatible 4096-wide last-token Qwen3-8B vectors. |
Names returned by TypeSafe, such as jev-latest | TypeSafe's hosted Jev API. | You have a TypeSafe API key and intend to send the state and questions to TypeSafe. |
Laya is one model family with three checkpoints. Its automati
只显示了开头部分;其余内容请在仓库中阅读