Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者による説明(英語の原文)
Signed proof of web observations for AI agents: Ed25519 proof packets for any URL.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"verify-atom": {
"command": "uvx",
"args": [
"verify-atom-mcp"
]
}
}
}ターミナルでこれを実行します
claude mcp add verify-atom -- uvx verify-atom-mcpプロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"verify-atom": {
"command": "uvx",
"args": [
"verify-atom-mcp"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"verify-atom": {
"type": "stdio",
"command": "uvx",
"args": [
"verify-atom-mcp"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント asherengos で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(0.1.0)がレジストリに届いたのは41 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv)も必要です。
同じカテゴリには:Spec Driven Development, Remote Desktop Commander, Verbaly
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況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.
i18n for coding agents: extract, check and translate an app's text, with drafts a person approves
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
The production backend for the verification atom: "check this one thing for me, and prove you did." A client POSTs one question (http_observation of a URL); the service performs a real observation and returns a signed proof packet with transparent cost accounting. Every verification is appended to a public, permanent ledger — the board.
Honesty, up front:
cost_usd on every packet is an operator-configured estimate, not a metered cloud bill ("cost_basis": "estimate"). Recalibrate before pricing.payments.enabled is true without one.mcp/)This repo also ships a Model Context Protocol server that exposes the verification atom as an MCP tool, so MCP-compatible agents can request signed proof packets directly.
uvx verify-atom-mcp (published on PyPI as verify-atom-mcp)io.github.asherengos/verify-atomverify — performs an HTTP observation of a URL and returns the Ed25519-signed proof packetmcp/mcp_server.py (zero dependencies; mcp/README.md has the details)| File | Role |
|---|---|
app.py | Flask app: routes, SSRF-guarded HTTP observation, packet assembly |
signing.py | Ed25519 key management + sign/verify (crypto core vendored from the Asher AI Studios Work Kernel, 2026-09-25; pure Python, RFC 8032, zero deps) |
costs.py / cost_model.yaml | Per-verification usage measurement × operator-configured rates |
ledger.py | Append-only JSONL ledger (data/ledger.jsonl): the board's source of truth and the honest loop's input |
mini_yaml.py | Strict subset YAML reader (keeps deps to flask + waitress; not a general parser) |
config.yaml | Service config: port, data dir, price, guardrails, payments switch |
tests/test_service.py | Hermetic pytest suite (local stub server; no external network) |
A verification flows: POST /verify → SSRF guard → real socket-level HTTP fetch (single DNS resolution; the checked address is the connected address; redirects never followed) → observation + evidence → cost accounting → Ed25519 signature over canonical JSON → append to ledger → proof packet.
cd ~/workspace/verify-service
python3 -m venv .venv .venv/bin/pip install -r requirements.txt # flask + waitress only; free .venv/bin/python app.py # serves on 127.0.0.1:5057 via waitress
First run generates an Ed25519 keypair under data/keys/ (0600). data/ is gitignored: ledger, keys, and runtime state never enter the repo.
Development (Flask built-in server, do not use in production):
.venv/bin/python -m flask --app app:create_app run -p 5057
curl -s -X POST http://127.0.0.1:5057/verify \
-H 'Content-Type: application/json' \ -d '{"type":"http_observation","url":"https://example.com"}' | python3 -m json.tool
Response: a signed proof packet.
{
"id": "VRF-20260926-3f9a2c1d", "type": "http_observation", "verdict": "CONFIRMED", "target": {"url": "https://example.com"}, "observation": { "reachable": true, "http_status": 200, "page_title": "Example Domain", "body_sha256": "…", "tls": {"subject": "…", "issuer": "…", "not_after": "…"}, "dns": {"host": "example.com", "addresses": ["93.184.216.34"]} }, "evidence": [{"kind": "http_status", "value": 200}, …], "timestamp_utc": "2026-09-26T02:30:00Z", "usage": {"wall_time_s": 0.41, "bytes_in": 1830, "http_requests": 1}, "cost_usd": 0.0000109, "cost_basis": "estimate", "price_quote_usd": 0.005, "margin_usd": 0.0049891, "below_cost": false, "signature": "<64-byte ed25519 hex>", "signing": {"algorithm": "Ed25519", "public_key_hex": "…", "signed_fields": "all fields except 'signature' and 'signing'"} }
Verdicts: CONFIRMED (fetched, HTTP 2xx), UNCONFIRMED (fetched, other status — a real negative observation), ERROR (refused or failed; the observation.reason explains why). Unknown type → 400 unknown_type.
Spot-checking a packet (no trust required):
# fetch the service public key, then verify the signature offline:
curl -s http://127.0.0.1:5057/key
The signature covers the canonical JSON (sorted keys, compact separators) of every packet field except signature and signing. Recompute it and verify with any Ed25519 implementation.
curl -s http://127.0.0.1:5057/verify/VRF-20260926-3f9a2c1d | python3 -m json.tool
curl -s http://127.0.0.1:5057/board/feed | python3 -m json.tool
Each entry: {id, timestamp_utc, type, verdict, url}.
curl -s http://127.0.0.1:5057/health
curl -s http://127.0.0.1:5057/key
The private key is never logged, never served, never leaves signing.py.
config.yaml)| Key | Default | Meaning |
|---|---|---|
service.port | 5057 | Listen port |
service.data_dir | data | Runtime state (ledger, keys); gitignored |
verify.base_price_usd | 0.005 | Quoted price per verification (a quote, not a charge) |
verify.timeout_s | 10 | Network timeout per observation |
verify.max_body_bytes | 2097152 | 2 MB body cap; overage → ERROR verdict |
verify.allow_private | false | Never true in production. Lets the hermetic tests use a 127.0.0.1 stub |
cost_model | cost_model.yaml | Path to operator-configured rates |
payments.enabled | false | Master switch. true without a configured provider → refuse to start |
KeyStore generates an Ed25519 keypair into data/keys/{private.key,public.key} (directory 0700, files 0600; refuses to overwrite an existing key).private.key offline; losing it orphans the board's trust chain (old packets still verify against the published public key, but the service can no longer sign)./key with a key_id, keep the old public key published for historical verification. See go-live checklist.The $0 go-live bundle lives in deploy/:
| File | Role |
|---|---|
deploy/verify-service.service | Hardened systemd unit (unprivileged verify user, NoNewPrivileges, PrivateTmp, ProtectSystem=strict, restart on failure) |
deploy/Caddyfile | Reverse proxy with automatic TLS; forwards the real client IP (X-Forwarded-For) — the app trusts that header only from 127.0.0.1/::1 |
deploy/DEPLOY.md | Ordered runbook for a non-expert: Oracle Cloud Always Free ARM VM, hardening, first-boot keypair, systemd, Caddy, DNS, go-live checks |
Built-in abuse guard: POST /verify is rate-limited per client IP (sliding 60s window, verify.rate_limit_per_minute, default 30/min). Over the cap → 429 JSON with a Retry-After header. Set rate_limit_per_minute: 0 to disable (never disable on a public endpoint).
Run one worker per data directory (v1 has no cross-process locking on the ledger). The service binds 127.0.0.1 only; public traffic arrives via the reverse proxy.
Machine-readable docs for humans and agents: GET /llms.txt (text/plain) — endpoint contract, proof-packet fields, how to verify a signature offline, and the honesty notes.
deploy/, built 2026-09-26): hardened systemd unit, Caddyfile with automatic TLS, DEPLOY.md runbook (Oracle Cloud Always Free ARM VM, human steps marked), in-app per-IP rate limiting on POST /verify (30/min default, 429 + Retry-After), /llms.txt machine-readable API docs. All $0, stdlib-only, no payment code paths. Tests: 26/26 green.deploy/DEPLOY.md; decide the data-dir backup story (ledger + key backup are in the runbook).payments.provider, then flip enabled: true.data/ from dev); publish the public key; back up the private key offline.cost_model.yaml estimates with metered values; run a calibration batch; confirm margin_usd > 0 before quoting real prices.deploy/Caddyfile; replace the placeholder domain, validate, reload./health; ledger growth, below_cost counts, error rates — the honest loop must page someone when the loop turns red.