Offline verification MCP server for ScopeBlind and Veritas Acta artifacts.
Four well-named, read-only tools with comprehensive descriptions (avg 280 chars, well above 194 baseline). All tools have explicit input schemas with type definitions and parameter descriptions. Tool annotations (readOnlyHint, idempotentHint) are present. However, output schemas are documented only in descriptions, not as formal JSON Schema objects. Error handling is present but minimal, no recovery guidance or actionable next steps for common failures (e.g., 'no_public_key' error lacks suggestion to call explain_artifact first). Parameter descriptions are strong but could specify format constraints more formally (e.g., public_key_hex format, file path validation).
Inspect a signed artifact WITHOUT verifying it: reports what the artifact claims to be so you can choose the right verification tool and key. Requires no key; read-only and offline. Provide raw JSON (artifact_json) or a local file path (path). Returns JSON { type, format ('v1'|'v2'|'passport'), issuer, kid, issued_at, payload_keys (sorted, signature excluded) }. It performs no signature check, so a well-formed forgery will explain cleanly; use verify_receipt to check authenticity.
Run the packaged offline self-test: verifies a known-good sample receipt and sample audit bundle shipped with the server. Read-only and deterministic; no network calls and no ScopeBlind servers are contacted. Returns JSON { ok: boolean, receipt: { valid, type, format, kid, issuer, hash }, bundle: { valid, total, passed, failed }, note }. If the packaged samples cannot be read it returns { ok: false, error }. Call this first to prove the verifier works before verifying your own artifacts.
Verify every receipt in a ScopeBlind audit bundle offline, using the bundle's embedded verification keys (the JWK set at verification.signing_keys, matched to each receipt by kid). Read-only; no network calls. Provide the bundle as raw JSON (bundle_json) or a local file path (path). Returns JSON { valid: boolean (true only if every receipt verifies), total, passed, failed, receipts: [{ index, type, kid, valid, error }] }. A document without a receipts array returns { ok: false, error }. For a single artifact, or to supply an external key, use verify_receipt instead.
Verify the Ed25519 signature of a single signed artifact (decision receipt, restraint receipt, passport envelope, or other Veritas Acta artifact; v1, v2, and passport formats are auto-detected). Read-only and fully offline. Provide the artifact as raw JSON (artifact_json) or a local file path (path); artifact_json wins if both are given. Verification uses public_key_hex when provided, otherwise a key embedded in the artifact payload; if neither exists it returns valid: false with error 'no_public_key' rather than guessing. Returns JSON { valid: boolean, error: string|null (e.g. 'invalid_signature', 'no_public_key'), type, format ('v1'|'v2'|'passport'), kid, issuer, hash (SHA-256 over the canonical unsigned bytes) }. Unparseable input returns { ok: false, error }.
Output schemas documented only in prose descriptions, not as formal JSON Schema. LLMs cannot parse expected response structure from text alone.
Error responses lack recovery guidance. 'no_public_key' error does not suggest calling explain_artifact() first to inspect the artifact. 'Invalid bundle: missing receipts array' does not guide the user to the correct tool.
public_key_hex parameter description lacks format specification. Should state: '64 hex characters (32 bytes) representing an Ed25519 public key'.
File path parameters (path) lack validation guidance. No mention of absolute vs relative paths, symlink handling, or file size limits.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
No batch variant for verify_receipt when processing multiple artifacts. Agents calling this in a loop waste tokens and latency.