Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
1 MCP server, 13 databases, zero config. Multi-protocol transport with Auth + RBAC.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"mosta-net": {
"command": "npx",
"args": [
"-y",
"@mostajs/net"
]
}
}
}在终端中运行这条命令
claude mcp add mosta-net -- npx -y @mostajs/net粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"mosta-net": {
"command": "npx",
"args": [
"-y",
"@mostajs/net"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"mosta-net": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@mostajs/net"
]
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 apolocine 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(2.0.42)于7个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, MemberVault MCP by usefulapi
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ 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.
List courses; add users to courses, remove course access or delete users in MemberVault.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
One schema, 11 transports, 13 databases, multi-tenant auth — out of the box.
Schema-driven multi-protocol API server for the @mostajs ecosystem. Built with TypeScript on Fastify, designed for polyglot consumption (14 native NetClients).
Author : Dr Hamid MADANI \ Homepage : octonet.amia.fr · mcp.amia.fr
The socket board.
@mostajs/ormconnects to 13 databases; Octonet
(
@mostajs/net) re-exposes the same entities over 11 transports (REST,
WebSocket, gRPC, MQTT, AMQP…); NetClient then fans out to **18 language
clients** — so any external app plugs into your data, in any runtime.
Octonet (@mostajs/net) is a Node.js multi-transport server that exposes a single @mostajs/orm schema as 11 different network protocols simultaneously : REST, GraphQL, WebSocket, SSE, JSON-RPC, MCP, gRPC, tRPC, OData, NATS, Arrow Flight.
The same User entity is reachable as :
curl https://octonet.amia.fr/api/v1/User # REST
curl https://octonet.amia.fr/graphql -d '{"query":...}' # GraphQL wscat -c wss://octonet.amia.fr/ws # WebSocket curl -N https://octonet.amia.fr/mcp # MCP (Claude Desktop)
Backed by @mostajs/orm (13 SGBD dialects). Backed by @mostajs/rbac + @mostajs/auth + @mostajs/api-keys for multi-tenant identity. Backed by @mostajs/mproject for multi-project routing.
Octonet is the second cerebral lobe of the @mostajs trilogy :
The fastest way to test Octonet from any of the 14 runtimes :
alice-42)curl -X POST https://octonet.amia.fr/try \
-H "Content-Type: application/json" \ -d '{"alias":"alice-42"}'
{ "status": "ok", "data": { "alias": "alice-42", "projectSlug": "sandbox-alice-42", "apiKey": "sk_test_…(64 chars, shown ONCE)", "permissions": { "projects":["sandbox-alice-42"], "operations":["read","write"], "transports":["rest","mcp"] }, "expiresAt": "2026-05-02T18:38:19.920Z", "quota": { "reqPerDay": 500 }, "exampleCurl": "curl https://octonet.amia.fr/api/v1/sandbox-alice-42/User -H \"X-API-Key: sk_test_…\"", "mcpUrl": "https://octonet.amia.fr/mcp" } }
Your sandbox is :
User, Product, Order entitiesUse the apikey in any of the 14 NetClients :
# Java / .NET / Python / Go / etc.
export MOSTAJS_NET_URL=https://octonet.amia.fr export MOSTAJS_NET_API_KEY=sk_test_…
| Tier | Cible | Auth | Quota | Use case |
|---|---|---|---|---|
T1 — Sandbox publique /try | "I want to test in 10 minutes" | alias seul (pas d'email) | 500 req/jour, TTL 7j | démo NetClients, intégration tests |
| T2 — Compte enregistré octocloud.amia.fr | "j'utilise vraiment, gratuit" | email + mot de passe | 10 000 req/jour | apps personnelles, side-projects |
T3 — Self-host npx @mostajs/net init | "tes données chez toi" | admin local | aucune | enterprise, on-premise, AGPL |
Auto-generated from your registered schemas. Toggle each via env var (default : all enabled).
| # | Transport | Endpoint | Use case | Notes |
|---|---|---|---|---|
| 1 | REST | /api/v1/{Entity} · /api/v1/{project}/{Entity} | universel | 15 routes par entité (CRUD + count + search + aggregate + bulk + relations) |
| 2 | GraphQL | /graphql (POST) | front-end riches | schéma + GraphiQL IDE auto-générés via mercurius |
| 3 | WebSocket | wss://…/ws | temps réel | events entity.created/updated/deleted/upserted broadcast |
| 4 | SSE | /events (GET stream) | mobile / browser-friendly | server-sent events |
| 5 | JSON-RPC | /rpc (POST) | EVM-adjacent, classic | JSON-RPC 2.0 + method discovery |
| 6 | MCP | /mcp (POST/GET SSE) | agents IA (Claude, ChatGPT) | 15 tools/entité auto-générés (listed on mcp.so) |
| 7 | gRPC | :50051 | inter-services low-latency | .proto auto-généré, 6 RPCs/entité |
| 8 | tRPC | /trpc/{Entity}.{op} | TypeScript fullstack | type generation côté client |
| 9 | OData | /odata/{Collection} (+ $metadata) | SAP/Microsoft Dynamics | OData v4 ($filter, $select, $orderby) |
| 10 | NATS | mostajs.{Entity}.{op} | pub/sub edge | request-reply messaging |
| 11 | Arrow Flight | /arrow/* | analytics columnaire | streaming zero-copy |
Le même schéma, 11 portes d'entrée différentes, 0 codegen.
Persistence dialects fournis par @mostajs/orm :
| Catégorie | Bases | Dialect ID |
|---|---|---|
| SQL mainstream | PostgreSQL, MySQL, MariaDB, SQLite | postgres, mysql, mariadb, sqlite |
| SQL enterprise | Oracle, SQL Server, DB2, SAP HANA, HSQLDB, Sybase | oracle, mssql, db2, hana, hsqldb, sybase |
| NewSQL / Cloud | CockroachDB, Google Cloud Spanner | cockroachdb, spanner |
| NoSQL | MongoDB | mongodb |
Switch dialect = changer 1 ligne d'env :
DB_DIALECT=postgres → DB_DIALECT=mongodb
SGBD_URI=postgresql://… → SGBD_URI=mongodb://…
Octonet utilise un middleware d'authentification basé sur API keys avec scopes (orienté machine-to-machine) + RBAC pour la gestion humaine. L'orchestrateur agnostique vit dans @mostajs/auth/lib/check-request.ts.
HTTP Request
│ ▼ authGuard (Fastify adapter) │ ▼ checkRequest (@mostajs/auth — framework-agnostic) │ ├─ extract X-API-Key from header / Bearer token / ?apikey= ├─ resolveApiKey (@mostajs/api-keys) — DB lookup + bcrypt verify ├─ isScopeAuthorized (@mostajs/api-keys) — check scope.values │ for each (scope, value) pair : │ checks: [{scope:'projects', value:slug}, │ {scope:'operations', value:'read'|'write'|'admin'}, │ {scope:'transports', value:'rest'|'mcp'|...}] ├─ touchApiKey — fire-and-forget : lastUsedAt, usageCount, lastIp │ ▼ ormHandler (entité CRUD) ─→ sanitizer (strip password/hash/tokens) │ ▼ HTTP Response
Une apikey a la shape :
{
permissions: { scopes: { projects: ['my-project','demo'] | '*', // declared by @mostajs/mproject operations: ['read','write','admin'] | '*', // declared by @mostajs/orm transports: ['rest','graphql','mcp'] | '*', // declared by @mostajs/net // anything: any module can register a new scope }, rateLimit: 500, } }
@mostajs/api-keys ne connaît PAS les noms projects/operations/transports — c'est volontaire. Chaque module enregistre ses scopes au boot via registerScope(dialect, {name, label, …}). Le check est générique : isScopeAuthorized(perms, scope, value).
| Cas | HTTP code | Body |
|---|---|---|
| Pas d'apikey | 401 | {error: {code:'UNAUTHORIZED', message:'API key required…'}} |
| Apikey invalide / révoquée | 401 | {error: {code:'UNAUTHORIZED', message:'Invalid or revoked API key'}} |
| Apikey valide hors scope | 403 | {error: {code:'FORBIDDEN', message:'API key not authorized for X="Y"'}} |
| Apikey OK | 200/201 | {status:'ok', data: …} (sanitized — no password/hash) |
L'endpoint /mcp autorise un fallback automatique sur l'apikey labelée public-default quand aucune clé n'est présentée — préserve la compat avec mcp.so / Claude Desktop. La clé publique est read-only sur le projet `default` uniquement → écritures bloquées.
Les champs password, hash, verifyToken, resetToken, apiKeyHash, secret, privateKey sont automatiquement strippés de toutes les réponses JSON par un middleware global. Aucun risque de leak à travers /api/v1/User?limit=1.
Le catalogue des scopes vit en base de données du projet accueillant (pas de fichier JSON, pas de constantes hardcodées) :
-- Auto-créées au boot via @mostajs/api-keys
CREATE TABLE api_key_scopes ( id, name, label, description, icon, cardinality, valuesSource ('static' | 'dynamic'), dynamicSourceRef );
CREATE TABLE api_key_scope_values ( id, scopeName, value, label, sortOrder, metadata );
Chaque module enregistre ses scopes au boot :
import { registerScope } from '@mostajs/api-keys/server'
// Dans mosta-net/src/server.ts (boot) await registerScope(dialect, { name: 'transports', label: 'Network transports', cardinality: 'low', valuesSource: 'static', staticValues: [ {value:'rest', sortOrder:1}, {value:'graphql', sortOrder:2}, // … 9 more ], })
await registerScope(dialect, { name: 'projects', label: 'Projects', cardinality: 'high', valuesSource: 'dynamic', dynamicSourceRef: 'Project.slug', // queried at runtime })
L'admin UI charge le catalogue dynamique via GET /api/api-keys/scopes et rend une matrice (composant React ApiKeyScopeMatrix dans @mostajs/api-keys/components/).
Via @mostajs/mproject — N bases de données isolées sur le même serveur.
# Default project (DB_DIALECT + SGBD_URI au boot)
curl http://localhost:4488/api/v1/User
curl http://localhost:4488/api/v1/analytics/events
curl http://localhost:4488/api/v1/events -H "X-Project: analytics"
curl -X POST http://localhost:4488/api/projects \
-H "X-API-Key: " \ -d '{ "name": "analytics", "dialect": "mongodb", "uri": "mongodb://localhost:27017/analytics",
只显示了开头部分;其余内容请在仓库中阅读