Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者による説明(英語の原文)
Verify artifacts produced by AI agents: schema, emptiness, provenance, authority.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
ウェブ、デスクトップ、モバイルのClaudeで使えます:
https://attest.rta.lat/mcpターミナルでこれを実行します
claude mcp add --transport http attest https://attest.rta.lat/mcpプロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"attest": {
"url": "https://attest.rta.lat/mcp"
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"attest": {
"type": "http",
"url": "https://attest.rta.lat/mcp"
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
ChatGPTがつなげるのは、インターネット上のサーバーだけです:
https://attest.rta.lat/mcpメニューの名前は、プランや時期によって少し違うことがあります。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
ツールの名前と説明は、サーバーが2026年11月6日に返したそのままの内容です。書いたのは作者で、私たちではありません。プレーンテキストとして表示しています。
verify_artifactVerify an artifact produced by an AI agent before accepting or paying for it. Four independent layers: schema conformance, whether there is anything inside (uniform lists, stubs, truncations), provenance bound to the artifact hash, and whether a signed mandate permitted the actio
verify_artifact_batchVerify several artifacts at once — a scan report, a list of findings, a set of tool descriptions. One call, one verdict per artifact, plus a summary of how many were accepted, need review, or were rejected. Use when an agent produced a batch (twenty findings from a security scan,
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント mrpkk で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
513ミリ秒で応答(HTTP 200)
サインイン不要
2件のツールの説明を読み、AIへの隠れた指示は見つかりませんでした
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック3項目のうち3項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
作者のクラウドで動きます。インストール不要でインターネット経由でつながりますが、送った内容は作者のサーバーを通ります。
GitHubリポジトリの最終更新は–、最新バージョン(0.1.1)がレジストリに届いたのは3 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。URLでつながるので、リモートMCPサーバーに対応したアプリ(開発者モードのChatGPTなど)でも使えます。
同じカテゴリには:Spec Driven Development, Remote Desktop Commander, 御府和田玉 在售作品查询
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ 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.
Live in-stock Hetian jade from Yufu, Shanghai: prices, monthly price guide, book a viewing.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
Agent action receipts, verified offline. A receipt says what an agent was recorded as doing at the boundary that governed it. Verifying one is not a signature check: the bytes must be canonical, the chain rules must be applied as a set, and a checkpoint signed by a stranger must never become an accusation against someone else's history. [What a verifier must reject →](https://attest.rta.lat/receipts)
Live: [https://attest.rta.lat/demo](https://attest.rta.lat/demo) · Receipts: [https://attest.rta.lat/receipts](https://attest.rta.lat/receipts) · Offline verifier: [https://attest.rta.lat/verify-offline](https://attest.rta.lat/verify-offline) · Docs: [https://attest.rta.lat/docs](https://attest.rta.lat/docs) · Refusal evidence for agents ($99 / 30 days): [https://attest.rta.lat/deny-evidence](https://attest.rta.lat/deny-evidence)
Conformance corpus, CC0: conformance/receipt-vectors.json — 12 vectors including five that must be rejected. A Python and a browser implementation agree on all twelve.
Pricing: the verifier is free, forever. An audit of what your agents spent is $500 flat — ten working days, one line of evidence per finding. Developer access for pipelines: $0.005 per call over x402 (USDC on Base), or $99 for 30 days ($49 at India purchasing-power parity).
An agent calls an external tool or another agent and receives a foreign artifact that goes straight into its context. Nothing checks that the artifact:
attest closes that gap. The receipt core has no dependencies; 813 tests (809 pass, 4 skip). Free human review of one artifact: https://attest.rta.lat/review BusinessMCP Marketplace: https://businessmcp.com/mcp-servers/attest
Each layer answers only its own question, and none substitutes for the others. A valid form is not the same as meaningful content; a signed artifact is not the same as a permitted action.
emptiness.pyDoes the artifact say anything? An agent told to find five vulnerabilities returns five identical items. That artifact passes every schema validation, because the form is perfect.
Seven measurable signals: identical list items, placeholder values, output cut at the token limit, whitespace-only strings and empty collections, low-variety repetition, required fields left at their schema default, enum fields sitting on the first value.
Verdicts are VALID_BUT_EMPTY, THIN_CONTENT, CONTENT_PRESENT.
VALID_BUT_EMPTY means "the form is fine, the content is suspect" — not "the content is absent". Suspicion requires a person; a verdict requires proof. The difference matters.
Every signal shows where and why. Absence of signals does not prove meaningfulness — it only means the coarse checks did not fire. That sentence is in the code, in the docstring and in the API response.
generation.pyA signature proves *who signed*. It does not prove *where the file came from*. Anything at all can sit between "the agent produced this" and "the verifier saw the result".
Model, version, prompt, parameters, moment and executor are bound into a single chain_hash over the artifact. Change any link and the binding stops matching.
Absence of a binding is explicit, not silent. Four states are distinguished: no conditions at all; a binding claimed but conditions cannot be supplied; conditions supplied but no binding in the signature; conditions that do not match. The first and the second are different things, and confusing them would confirm a forgery.
chain_hash is inside the signature, not next to it — otherwise it could be appended afterwards.
signing.pyHMAC requires a secret, and the secret is only ours. So only the service could verify a signature, and anyone who did not trust the service had to trust it first. For a product about trust, that is a contradiction at the foundation.
Now Ed25519. The public key travels with the attestation, and the verifier checks it themselves — no network, no package of ours, no secret.
python3 attest/verify_standalone.py attestation.json
That script imports nothing from attest and opens no sockets. A test enforces both.
authority.pyWas the action permitted? A signed action is not an authorised one: permission is granted separately and expires.
Rules match drift.check exactly — amount, payee, audience, currency, window, intent. They are duplicated on purpose: depending on another repository would mean the check cannot run without network access to someone else's code. Six comparisons are cheaper to duplicate than to make unverifiable.
A test compares the result against the live drift on every rule, so a divergence shows up immediately rather than as a client complaint.
Absence of a mandate is a denial, never consent. A verifier who presents no permission has not demonstrated one.
pop/1A signed report about one physical site: what matched, what did not, what we could not check. The JSON is canonicalized with RFC 8785 (JCS) and signed with Ed25519. The verifier needs no network, no account and no server of ours.
python -m attest.pop_verify report.json --key public_key.txt
It prints the verdict and the reason, and exits 0 only for ok.
| Verdict | Meaning |
|---|---|
ok | chain, signature, PDF hash and verdict rules all hold |
tampered | not the report that was signed: a layer, a hash or a limit changed |
unsigned | no signature, or no key to attribute it |
wrong_key | signed with a key other than the pinned one |
expired | a mark is older than its valid_for_s |
Verify offline in seven steps:
report.json, report.pdf and public_key.txt through two different channels. The key is deliberately not inside the report.python -m attest.pop_verify report.json --key public_key.txt (Python 3.11+ and cryptography; nothing else).verdict: ok. Any other verdict names the check that failed.sha256sum report.pdf with pdf_sha256, or pass --pdf report.pdf and let the verifier do it.limits and not_checked. If either is empty, the report violated our own spec and must not be accepted.issuer.key_id against the key id we publish separately.verify() also checks the layer chain (prev_hash → hash for every layer, including the first), so removing a layer or editing one hash breaks the report. It does not recompute the files inside the client ZIP — their hashes are covered by the chain, but the bytes are not in the JSON. It does not prove GPS honesty or ownership; those limits travel in the report itself.
pop_buildpython -m attest.pop_build --photos photos/ --claim claim.json \
--key private.key --out report.json python -m attest.pop_verify report.json --key public_key.txt
claim.json is what the client asserts before we look at the files:
{
"subject": {"type": "parcel", "ref": "client-ref-1"}, "claim": "40 ha, solar farm, operational", "location": {"lat": "52.123456", "lon": "4.654321"}, "captured_at": "2026-11-02T11:20:00Z" }
captured_at and subject.ref/subject.claim are required; a broken coordinate ("lat": "52,1") stops the build instead of turning into "not declared" — a typo must not be reported as a missing fact. Every file in --photos is hashed for the content layer. EXIF is read when present: DateTimeOriginal and GPS go to position, and the first photo that carries GPS is named in the layer.
| Verdict | Rule |
|---|---|
contradicted | coordinates differ by more than the tolerance, or the independent source says mismatch |
insufficient | nothing to compare: no GPS in the photos and no capture time |
confirmed | coordinates, time and all four layers agree, including an independent source |
partial | everything else: something matched, something could not be checked |
Tolerances. 500 m for coordinates and 2 hours for capture time are constants in attest/pop_build.py. 500 m is not the precision of a GPS fix (5–20 m); it is the size of the thing being claimed. A 40-hectare parcel has a side of ~630 m, so a photographer standing at a corner while the claim names the centre honestly differs by hundreds of metres. Two different quarters, or two different fields, do not fall inside 500 m. For time, DateTimeOriginal carries no timezone and camera clocks drift by an hour or two; a different day is a different object, so a day-old photo must not pass as today's.
Ceiling without an independent source. The builder has no satellite or partner capture, so independent is written as not_available — never invented. pop/1 forbids confirmed next to an unavailable layer, so a photos-only report tops out at partial. Pass --independent source.json ({"source": "sentinel-2", "result": "match", "asset_ref": "…"}) when a real independent look exists; only then can confirmed be reached. location.basis says exif_gps or claimed, so a report never hides which one it stands on.
While building layer 3, this was found in the existing code: with ATTEST_SECRET unset, signatures were computed with attest-dev-key-do-not-use-in-production, hardcoded in the source. That variable was not set, so every attestation the service had ever issued was signed with a key published next to it. Anyone could have signed an artifact as if the service had verified it.
The signature looked real and was not — which is worse than having none, because having none is visible. It is fixed: with no key, there is no signature.
https://attest.rta.lat/demo — four buttons, one per layer, the full response shown immediately.
https://github.com/mrpkk/attest
Part of the Indra set — six small services for agents that have to be trusted: https://indra.rta.lat
attest is an MCP server: it speaks the Model Context Protocol over Streamable HTTP (JSON-RPC 2.0) and exposes the verifier as MCP tools.
verify_artifact — verify one artifact, returns verdict, trust score and findings;verify_artifact_batch — verify a batch in one call (a scan report, a list of findings) and get one verdict per artifact plus a summary;bridge_check — settle paid work between two agents through an escrow bridge, with a signed receipt (offline-verifiable). Optional: it is listed only on a node configured with an escrow bridge, so the public node returns two tools from tools/list. The call stays in the code and answers with a clear "bridge not configured" error instead of vanishing mid-session.resources/list answers with an empty list rather than an error, so MCP clients and directory scanners do not mark the server as broken.prompts/list answers with an empty list for the same reason.X-ATTEST-ENTITLEMENT header for a pr冒頭だけを表示しています。続きはリポジトリで読めます