Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
QRNG-seeded random bytes, seeds, and ML-KEM-768 keys with signed provenance receipts.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
适用于网页版、桌面版和手机版 Claude:
https://api.qeaas.eu/mcp在终端中运行这条命令
claude mcp add --transport http qeaas https://api.qeaas.eu/mcp粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"qeaas": {
"url": "https://api.qeaas.eu/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"qeaas": {
"type": "http",
"url": "https://api.qeaas.eu/mcp"
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
ChatGPT 只能连接互联网上的服务器:
https://api.qeaas.eu/mcp菜单名称可能因套餐和版本不同而略有差异。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
我们还没有读取这个服务器的工具列表;我们会轮流检查各个端点。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日
发布者(qeaas.eu)不是仓库所有者(PeterJasSK);可能是其他人代为上架的
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
尚未检查;我们会轮流检查各个端点
尚未检查;我们会轮流检查各个端点
尚未检查;我们会在检查端点时读取工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 0 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
GitHub 仓库最后更新于–,最新版本(1.0.0)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Winecellarbuilders
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ 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.
Find the team for your wine room.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Want an API key? Email peter.jas@cnl.sk.
FastAPI service that turns preloaded QRNG (quantum random number generator) bits into served randomness, dice rolls, cryptographic seeds, and post-quantum ML-KEM key material — each issue carrying a signed, offline-verifiable provenance receipt.
Monorepo layout: api/ (this document — FastAPI service), web/ (Next.js explainer + demo), shared/ (docs, spikes), claude/ (epic build plans). The web app is a thin client over the API; everything substantive happens here.
Honest framing, stated once and meant everywhere. QRNG does not "defeat quantum
attackers." Raw QRNG bits are *never served*. They are entropy that **seeds a standards
HMAC-DRBG** (NIST SP 800-90A). Every byte this API returns —
/random,/dice,/v1/random/bytes,
ML-KEM seeds — is DRBG output. The quantum part is the *entropy source*; any quantum
*resistance* comes from ML-KEM-768 (FIPS 203), not from the randomness being "quantum."
┌──────────── admin (X-Admin-Token) ────────────┐
│ │ QRNG .txt │ POST /admin/ingest │ POST /admin/keys (0/1 bits) ▼ ▼ POST /admin/keys/revoke ┌─────────────┐ AES-256-GCM ┌───────────────────────────────┐ │ pool.parse │ ───────────────▶ │ Postgres (Neon) │ │ + encrypt │ │ entropy_pool (ciphertext) │ └─────────────┘ │ drbg_root (ciphertext) │ │ api_keys / usage_log / │ │ issue_log │ └───────────────┬───────────────┘ │ decrypt slice on reseed ▼ client ┌───────────────────────────────────────┐ ─────────▶ entropy gate │ keyed_drbg.output(n) │ request (503 if low) │ root_key ← reseeded from pool │
db.connect); there is no long-lived pool object. DRBG state is never read-modify-written per request — see §4.WEB_ORIGIN (comma-separated).main.py).Source map (api/qeaas/):
| Module | Responsibility |
|---|---|
main.py | FastAPI app, all route handlers, CORS, entropy header middleware |
generation.py | The single served-randomness choke point + provenance metadata builder |
keyed_drbg.py | Serverless-safe DRBG wrapper: reseed schedule, Redis-counter mixing |
drbg.py | Pure NIST SP 800-90A HMAC-DRBG (SHA-256) |
pool.py | Entropy pool: parse 0/1, AES-256-GCM encrypt/decrypt, HKDF sub-keys, burn() |
db.py | Parameterized psycopg helpers for all five tables |
redis_client.py | Lazy Upstash client: atomic counter + rate-limit ops |
gate.py | Low-entropy gate (entropy_level, require_entropy dependency) |
auth.py | Admin-token guard, API-key hashing + validation |
ratelimit.py | Per-IP / per-key rate limits, anon daily ceiling, per-key quota |
dice.py | Rejection-sampled dice (no modulo bias) |
kem.py | QRNG-seeded ML-KEM-768 keygen + encapsulation |
receipts.py | Ed25519 receipt signing + verification |
errors.py | Flat {"error": " "} envelope for every failure |
schemas.py | Pydantic request/response models |
Every served byte flows through one choke point, generation.random_bytes(n) → keyed_drbg.output(n). Nothing bypasses it.
A. Ingest (admin, offline of the request path). POST /admin/ingest → pool.ingest_bits_bytes() → pool.parse_bits_bytes() packs the 0/1 text MSB-first into bytes (discarding a trailing partial byte, rejecting any non-0/1 char) → pool.encrypt_chunk() AES-256-GCM-encrypts it → db.insert_pool_chunk() stores (ciphertext, nonce, tag, plaintext_len, source_label) in `entropy_pool`. Plaintext never touches disk; the upload buffer is burn()-ed.
B. Serve (per request). keyed_drbg.output(n):
maybe_reseed() — loads the warm root-key cache (_load_cache), bootstrapping the root key from the pool on very first use (_bootstrap_root_key). If the reseed schedule is due (§4), pool.pull_reseed_material(32) decrypts the next unconsumed 32-byte slice from entropy_pool, encrypts it as the new drbg_root row, advances consumed_offset, and burn()s the plaintext.redis_client.incr_counter() — atomic INCR drbg:counter, returns a globally unique integer.HmacDrbg is instantiated with the decrypted root_key and generate(n, additional = counter.to_bytes(8) + additional) is called — the counter guarantees two concurrent requests can never produce identical output even with identical root key.db.bump_outputs_since_reseed() increments the reseed odometer.C. Wrap (per endpoint). generation.new_issue_meta(size) mints a request_id (uuid4), reads entropy_epoch (= drbg_root.reseed_counter), timestamps, and calls receipts.sign(...) to produce the Ed25519 receipt. Keyed endpoints then write db.insert_usage_log() (abuse spotting) and db.insert_issue_log() (metadata-only provenance — no output bytes are ever stored).
See the deep-dive comment at the end of this file / in the chat analysis for the exact call graph.
They protect against completely different failure modes and have opposite consistency needs.
Holds everything that must survive and must be transactional & durable. Five tables:
| Table | Holds | Notes |
|---|---|---|
entropy_pool | AES-256-GCM ciphertext of QRNG bits + nonce, tag, plaintext_len, consumed_offset, source_label | The vault. No plaintext-bytes column exists. consumed_offset tracks how much of each chunk has been spent. |
drbg_root | AES-256-GCM ciphertext of the current DRBG root seed + reseed_counter, outputs_since_reseed, rotated_at | The live DRBG key, rotated ("reseeded") from the pool on schedule. reseed_counter == entropy_epoch in receipts and drbg_reseeds in /health. |
api_keys | key_hash (HMAC-SHA256, peppered), owner, tier, daily_quota_bytes, revoked, created_at | Plaintext keys never stored. Read fresh every request so revocation is instant. |
usage_log | (ts, principal, endpoint, nbytes) | Abuse-spotting ledger for keyed issues. Anon /random//dice are not logged here. |
issue_log | (request_id, principal, endpoint, size, epoch_id, ts) | Metadata-only provenance. No output-bytes column exists, ever — verify provenance, not the secret. |
Durability matters: lose the pool ciphertext or the root key and the service can no longer prove provenance or reseed. Postgres is ACID; this is where correctness lives.
Holds only fast, disposable, atomically-mutated counters that would be a correctness hazard in Postgres under serverless concurrency:
| Key | Purpose | Op |
|---|---|---|
drbg:counter | Output uniqueness. Monotonic integer mixed into every DRBG call so two concurrent serverless invocations can't emit the same bytes. | INCR |
rl:ip:{ip}:{minute} | Per-IP rate limit (anon routes) | INCR + EXPIRE 60 |
rl:key:{hash}:{minute} | Per-key rate limit | INCR + EXPIRE 60 |
anon:daily:{day} | Global anon output ceiling (5 MB/day) | INCRBY + EXPIRE, DECRBY on refund |
quota:key:{hash}:{day} | Per-key daily byte quota | INCRBY + EXPIRE, DECRBY on refund |
Why not put these in Postgres? On stateless serverless you cannot safely read-modify-write shared state per request — two concurrent requests would race. Redis INCR/INCRBY are atomic, so there is no read-modify-write. These values are *meant* to expire (per-minute, per-day) and losing them is harmless — throttling fails open on a Redis outage (logs a warning, allows the request), because the reseed-frequency floor (§4) still guarantees the pool can't be drained.
One-line summary: Postgres = durable secrets + audit that must be correct forever; Redis = ephemeral atomic counters that must be fast and race-free but are disposable.
drbg.py). Not thread-safe — each request gets its own instance.keyed_drbg.py): output(n) = HMAC-DRBG(root_key, INCR(drbg:counter), n).root_key rotates from the pool on whichever fires first:RESEED_INTERVAL_SECONDS), orRESEED_OUTPUT_LIMIT (100 000) but only if ≥ RESEED_MIN_INTERVAL_SECONDS (5 minutes) has elapsed. Each reseed pulls RESEED_PULL_BYTES (32) from the pool.THRESHOLD (64 KiB) of unconsumed pool bytes, /health reports degraded and all gated routes 503 low_quantum_entropy (gate.require_entropy).One env-held MASTER_KEY (256-bit hex). pool.derive_subkey(name) (HKDF-SHA256, RFC 5869 one-block Expand) derives exactly four named sub-keys — there are no other secrets:
MASTER_KEY (env / KMS only — never written to Postgres)
└── HKDF-SHA256 ├── "pool-encryption-key" → entropy_pool AES-256-GCM ├── "drbg-root-encryption-key" → drbg_root.root_key AES-256-GCM ├── "api-key-pepper" → API-key hashing (HMAC-SHA256) └── "receipt-signing-key" → Ed25519 receipt signing seed
AES-256-GCM is authenticated: a flipped ciphertext byte fails the tag check and decryption raises — the service fails closed on tampered storage. Sensitive plaintext (decrypted slices, the warm root-key cache, upload buffers) is held in bytearray and best-effort burn()-ed after use (CPython cannot *guarantee* zeroization; serverless teardown keeps in-process secrets short-lived by design).
| Mechanism | Header | Applies to |
|---|---|---|
| None (anonymous) | — | /health, /random, /dice, /v1/verify, /v1/pubkey |
| API key | X-API-Key: | /v1/random/bytes, /v1/kem/* |
| Admin token | X-Admin-Token: | /admin/* |
hash_api_key(key) = HMAC-SHA256(pepper, key); only the hash is stored. require_api_key reads the row fresh every request, so revoked = true只显示了开头部分;其余内容请在仓库中阅读