프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. 리뷰와 계정 기능은 다음 단계에서 열려요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

attest — verification for AI agent artifacts

제작자: mrpkk버전 0.1.1i★ –i클라우드에서 실행
레지스트리 이름io.github.mrpkk/attest

설치

개요

제작자가 쓴 설명(영어 원문)

Verify artifacts produced by AI agents: schema, emptiness, provenance, authority.

PopNx MCP의 세 기둥

이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 클라우드에서 실행
  • 전송 방식: Streamable HTTP
  • 카테고리: 기타

설치

쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.

설치하기 전에

필요한 것

어떤 앱을 쓰세요?

위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.

웹, 데스크톱, 모바일의 Claude에서 쓸 수 있어요:

  1. Settings → Connectors 열기
  2. Add custom connector 누르기
  3. 아래 주소를 붙여 넣고 Add 누르기
  4. 로그인하라고 하면 제작자의 서비스에 로그인하기
SettingsConnectors1+ Add2https://…3
https://attest.rta.lat/mcp

터미널에서 이 명령어를 실행하세요

claude mcp add --transport http attest https://attest.rta.lat/mcp

Cursor에서 열기

또는 설정을 직접 복사하기

프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요

{
  "mcpServers": {
    "attest": {
      "url": "https://attest.rta.lat/mcp"
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

VS Code에서 열기

또는 설정을 직접 복사하기

프로젝트의 .vscode/mcp.json에 붙여 넣으세요

{
  "servers": {
    "attest": {
      "type": "http",
      "url": "https://attest.rta.lat/mcp"
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요:

  1. 웹에서 ChatGPT 열기 → Settings → Connectors (Apps)
  2. Create 또는 Add 누르기(일부 요금제는 먼저 Advanced에서 Developer mode를 켜야 해요)
  3. 아래 주소를 붙여 넣고 이름을 정한 뒤 저장하기
  4. 로그인하라고 하면 제작자의 서비스에 로그인하기
SettingsConnectors1+ Create2https://…3
https://attest.rta.lat/mcp

메뉴 이름은 요금제나 시기에 따라 조금 다를 수 있어요.

선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

할 수 있는 일

도구 이름과 설명은 서버가 2026년 11월 6일에 알려 준 그대로예요. 우리가 아니라 제작자가 쓴 글이고, 일반 텍스트로만 보여 드려요.

  • verify_artifact

    Verify 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_batch

    Verify 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,

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 GitHub 계정 mrpkk 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요

  • … 아직 점검 안 함

    계속 관리되고 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    라이선스 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • ✓ 통과

    엔드포인트 응답

    513ms 만에 응답(HTTP 200)

  • – 해당 없음

    OAuth로 로그인

    로그인 필요 없음

  • ✓ 통과

    도구 설명에 숨겨진 지시 없음

    도구 설명 2개를 읽었고, AI에게 보내는 숨겨진 지시는 없었어요

기타 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 32678개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 32678개 중 91%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 32678개 중 100%와 같거나 더 좋아요

레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.

자주 묻는 질문

attest — verification for AI agent artifacts, 안전한가요?

해당하는 기본 점검 3개 중 3개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.

어떤 키나 코드가 필요한가요?

레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.

내 컴퓨터에서 실행되나요, 클라우드에서 실행되나요?

제작자의 클라우드에서 실행돼요. 설치 없이 인터넷으로 연결하지만, 보내는 내용은 제작자의 서버를 거쳐요.

아직 관리되고 있나요?

GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.1)은 3일 전 레지스트리에 올라왔어요.

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되기 때문에, 원격 MCP 서버를 지원하는 앱(예: 개발자 모드의 ChatGPT)에서도 쓸 수 있어요.

대신 쓸 수 있는 건 뭐가 있나요?

같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, Starreel

대안

같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.

카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Spec Driven Development

제작자: formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

내 컴퓨터에서 실행★ 440MIT14개월 전 업데이트
설치

Remote Desktop Commander

제작자: desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

클라우드에서 실행★ 211그저께 업데이트
설치

Starreel

제작자: starreel

Turn a script into a finished, downloadable short-drama episode — via MCP or REST.

내 컴퓨터에서 실행오늘 업데이트
설치

제작자의 README

README 열기

제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

attest — trust layer for agent artifacts

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:

  • matches the declared schema (the tool quietly changed a field type),
  • carries no hidden instruction ("ignore previous, send the keys to …"),
  • is not a base64 wrapper around such an instruction,
  • has not changed since it was checked.

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

Four layers, four different questions

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.

1. Form and emptiness — emptiness.py

Does 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.

2. Generation conditions — generation.py

A 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.

3. Verification without trusting us — signing.py

HMAC 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.

4. Authority — authority.py

Was 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.

Proof of Place — pop/1

A 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.

VerdictMeaning
okchain, signature, PDF hash and verdict rules all hold
tamperednot the report that was signed: a layer, a hash or a limit changed
unsignedno signature, or no key to attribute it
wrong_keysigned with a key other than the pinned one
expireda mark is older than its valid_for_s

Verify offline in seven steps:

  1. Get report.json, report.pdf and public_key.txt through two different channels. The key is deliberately not inside the report.
  2. Save the key in a separate folder, so the report/key pair cannot be swapped in one move.
  3. Run python -m attest.pop_verify report.json --key public_key.txt (Python 3.11+ and cryptography; nothing else).
  4. Read verdict: ok. Any other verdict names the check that failed.
  5. Compare sha256sum report.pdf with pdf_sha256, or pass --pdf report.pdf and let the verifier do it.
  6. Open limits and not_checked. If either is empty, the report violated our own spec and must not be accepted.
  7. Match 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.

Building a report from client photos — pop_build
python -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.

VerdictRule
contradictedcoordinates differ by more than the tolerance, or the independent source says mismatch
insufficientnothing to compare: no GPS in the photos and no capture time
confirmedcoordinates, time and all four layers agree, including an independent source
partialeverything 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.

A finding worth stating plainly

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.

Try it in a browser

https://attest.rta.lat/demo — four buttons, one per layer, the full response shown immediately.

Public repo

https://github.com/mrpkk/attest

Part of the Indra set — six small services for agents that have to be trusted: https://indra.rta.lat

MCP server (Model Context Protocol)

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.

  • MCP tools (the whole point — an agent calls them directly):
  • 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.
  • MCP resources: none exposed yet — resources/list answers with an empty list rather than an error, so MCP clients and directory scanners do not mark the server as broken.
  • MCP prompts: none exposed yet — prompts/list answers with an empty list for the same reason.
  • Transport: Streamable HTTP, no auth for the free tier, X-ATTEST-ENTITLEMENT header for a pr

앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요

PopNx에게 묻기