Skip to main content
Glama
ODATANO

@odatano/nightgate-mcp

Official
by ODATANO

@odatano/nightgate-mcp

npm NIGHTGATE MCP License

MCP server for NIGHTGATE, the Midnight attestation layer: anchor documents, prove zero-knowledge claims over hidden fields, manage disclosure grants, verify against live contract state. Agents write through fee sponsoring: they build and prove locally, a sponsor pays.

Quick start

Get an oda_… key at api.preprod.odatano.dev (Cardano wallet sign-in, giveaway code, or tADA over x402), then:

{
  "mcpServers": {
    "nightgate": {
      "command": "npx",
      "args": ["-y", "@odatano/nightgate-mcp"],
      "env": { "ODATANO_ACCESS_KEY": "oda_..." }
    }
  }
}

Claude Code: claude mcp add nightgate --env ODATANO_ACCESS_KEY=oda_... -- npx -y @odatano/nightgate-mcp

The hosted gateway is the default (Midnight preprod). The same key works for @odatano/core-mcp (Cardano). Node.js >= 20.

Related MCP server: Agent Identity MCP Server

Tools

Tool

What it does

verify_attestation, verify_predicate, verify_predicate_attestation, verify_document

Check records and ZK claims against live contract state; absent = verified: false

prepare_document_proof, prepare_membership_set

Build proof inputs: salted content tree, set root

anchor_document, attest_agent_output

Anchor a document hash or an agent-output envelope (async)

prove_field_predicate, prove_field_equality, prove_field_membership

ZK claims over one hidden field (async)

prove_field_predicates_batch

Up to 8 claims in one transaction (async)

prove_document_integrity, prove_document_diff

ZK claims across two documents (async)

grant_disclosure, revoke_disclosure

On-chain disclosure ACL (async)

build_sponsorable_transaction, get_attester_identity

Build, prove and sign locally; the attester id and shielded keys it builds under

sponsor_unbound_transaction, sponsor_finalized_transaction

Hand locally built bytes to a sponsor that pays and submits (async)

get_swap_wallet, read_swap_offer

Shielded coins of the local wallet; what an offer gives and wants

build_swap_offer, take_swap_offer, revert_swap_offer

Build one half of a shielded swap locally, take an offer, release a half

sponsor_swap

Hand both halves of a swap, or a board offer plus the taker half, to a sponsor that merges, pays and submits (async)

post_swap_offer, list_swap_offers, retire_swap_offer

The server's offer board: post a maker half, find open offers, take yours down

get_swap_offer, my_swap_offers, get_board_status

Follow one offer, see your own posts and their fills, read the board's counts without credentials

mint_token

Mint a shielded token with a name of your own on a token factory: built here with the seed as issuer and sponsored, or by a server session (async)

grant_disclosure_to_holders, revoke_holder_disclosure, claim_disclosure, holder_claim_key

Disclose a document to the holders of a token; read it with the secret behind a registered claim key

derive_token_type

Token type a minting contract produces

get_job_status

Poll an async job; batches report chainSegments, swaps swap

analytics_*

Midnight aggregates via ODATANO ASTRA, when the host serves it

Errors carry the server's HTTP status and code (INVALID_ARGUMENT, ...).

Fee sponsoring

  1. build_sponsorable_transaction builds and proves the call locally (needs @odatano/nightgate-tx installed next to the server and NIGHTGATE_SEED_HEX).

  2. sponsor_unbound_transaction with a sponsor session id or the platform pool id 00000000-0000-0000-0000-706f6f6c0000.

  3. get_job_status with the returned sessionId, then verify_attestation.

failed / CHAIN_EXECUTION_FAILED: landed but not applied; build again, never resubmit the same bytes.

Shielded swaps

Two wallets exchange two shielded tokens without a contract. Each side builds one half, the halves mirror each other, a sponsor merges them and pays the fee. Needs @odatano/nightgate-tx >= 0.8.0 next to the server and NIGHTGATE_SEED_HEX.

  1. get_swap_wallet: balance, free coins and spendable per token type. The first call starts the sync of the shielded coins (about 5 minutes from genesis, seconds with NIGHTGATE_SWAP_STATE_FILE).

  2. Maker: build_swap_offer with give and want returns the offer file (swapoffer1...) to publish, or post_swap_offer puts it on the server's board.

  3. Taker: list_swap_offers or read_swap_offer, then take_swap_offer with expect, a sponsorSessionId and, for a board entry, its offerId. It builds the mirror half and submits both.

  4. get_job_status with the returned sessionId; the result carries swap. The maker follows the offer with get_swap_offer or my_swap_offers (filled + filledTxHash); list_swap_offers with status: all and since is the board's change feed.

  • One half spends at most NIGHTGATE_SWAP_MAX_INPUTS coins, the smallest that fit. give.amount above spendable is refused before proving.

  • An offer fills once. Its coins stay reserved in the maker's wallet until the swap lands or revert_swap_offer releases them.

  • A refused submission keeps the proven half: sponsor_swap with its halfId.

  • The sponsor needs swaps switched on and both token types on its list; an agent grant needs sponsorSwap in allowedActions.

  • With NIGHTGATE_PROOF_SERVER_URL the proof server sees the coins a half spends: use one you run yourself.

  • Tokens to swap: mint_token mints on a token factory to this wallet (or any other wallet, given both of its keys). Without a sessionId the seed is the issuer: the mint is built and proven here (needs @odatano/contract-token-factory next to @odatano/nightgate-tx; the prover keys come from the package's release assets on first use) and the sponsor pays. A landed mint makes the type known to the sponsor.

  • get_board_status says whether a sponsor is ready before anything is built.

Configuration

Variable

Default

Purpose

ODATANO_ACCESS_KEY

unset

oda_… key, or an ngat_… agent grant on a direct instance

ODATANO_ACCESS_URL

https://api.preprod.odatano.dev

Gateway or a direct NIGHTGATE host

ODATANO_ACCESS_USER / _PASSWORD

unset

Basic auth of a direct instance

NIGHTGATE_SEED_HEX

unset

Seed (128 hex) for local building and swaps; never a tool argument

NIGHTGATE_NETWORK

preprod

Network of the local builder

NIGHTGATE_PROOF_SERVER_URL

unset

Prove on a proof server instead of in-process

NIGHTGATE_SWAP_STATE_FILE

unset

File for the swap wallet's state; it holds the wallet's coins, keep it like a key

NIGHTGATE_SWAP_MAX_INPUTS

4

Most coins one swap half spends; the sponsor's limit applies

NIGHTGATE_TIMEOUT_MS

30000

Per-request timeout

Also: NIGHTGATE_SERVICE_PATH, NIGHTGATE_INDEXER_SERVICE_PATH, ODATANO_ANALYTICS_URL, NIGHTGATE_INDEXER_HTTP_URL, NIGHTGATE_INDEXER_WS_URL, NIGHTGATE_NODE_URL, NIGHTGATE_ZK_CONFIG_BASE_URL, NIGHTGATE_ZK_CACHE_DIR.

Own instance

docker run -d -p 4004:4004 -e ENCRYPTION_KEY=$(openssl rand -hex 32) \
  -e NIGHTGATE_HTTP_PASSWORD=change-me -v nightgate-data:/data ghcr.io/odatano/nightgate:latest

Then ODATANO_ACCESS_URL=http://localhost:4004, ODATANO_ACCESS_USER=nightgate, ODATANO_ACCESS_PASSWORD=change-me. For agents, create a grant with createAgentGrant and pass its ngat_… token as ODATANO_ACCESS_KEY.

Compatibility

NIGHTGATE >= 0.24.0; chainSegments needs >= 0.28.0, swaps need >= 0.29.0, the offer board and holder disclosure need >= 0.30.0, get_swap_offer, my_swap_offers, get_board_status, the server way of mint_token and the status/since filters need >= 0.30.1. @odatano/nightgate-tx >= 0.10.2 for local building (local minting also needs @odatano/contract-token-factory). Per version: CHANGELOG.

Local building needs ONE @midnight-ntwrk/ledger-v8 in the install (npm ls @midnight-ntwrk/ledger-v8). expected instance of ... means two: npm dedupe.

Development

npm install && npm run integration

Live lanes:

NIGHTGATE_LIVE=1 NIGHTGATE_TEST_CONTRACT=<vault> NIGHTGATE_TEST_PAYLOAD_HASH=<64 hex> npm run integration
NIGHTGATE_SEED_HEX=<hex> NIGHTGATE_VAULT=<vault> NIGHTGATE_SPONSOR_SESSION_ID=<sponsor or pool id> npm run live:sponsor-unbound

License

Apache-2.0

Available Tools

12 tools
anchor_documentA

Anchor a document content hash on the Midnight chain via the AttestationVault attest circuit. Commits only the sha256 + public metadata; you are responsible for storing the actual bytes at storageRef. Attestation is first-come-first-served per hash. Async: returns { jobId, status } immediately; poll get_job_status until succeeded or failed. Also returns documentId for verify_document.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoContent size in bytes, informational
sha256Yessha256 of the document content (64 hex), becomes the on-chain payload hash
metadataNoPublic metadata object; its hash is anchored alongside
sessionIdYesWallet session id that signs and submits
storageRefYesWhere the bytes live, e.g. file://, s3://, ipfs://
contentTypeNoMIME type, informational
idempotencyKeyNoDedupes retries of the same anchor request
contractAddressYesAttestationVault deployment to anchor into
sponsorSessionIdNoOptional second session that pays the dust fee
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries behavioral disclosure. It reveals that only the sha256 and public metadata are committed, that the caller is responsible for storing the raw bytes, that anchoring is first-come-first-served per hash, and that the call returns immediately with a jobId while execution proceeds asynchronously. This is rich, non-obvious context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences with no wasted words. It front-loads the primary action, then packs essential caveats (storage responsibility, hash uniqueness, async behavior, related verification tool) into compact, high-value sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with no output schema, the description covers the critical user-facing contract: what is anchored, what the caller must handle, the async polling model, and the return values (jobId, status, documentId). Combined with the detailed schema, this is sufficient for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter. The description adds meaningful cross-parameter context by explaining that sha256 and public metadata are the committed payload, while storageRef holds the actual bytes—clarifying the division of responsibility between these fields. It does not re-explain each parameter, which is appropriate given the schema's completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Anchor a document content hash on the Midnight chain via the AttestationVault attest circuit.' It clearly distinguishes this from sibling tools like verify_document and get_job_status by framing the action as anchoring and mentioning the returned documentId for later verification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear workflow guidance: the caller must store the bytes at storageRef, the operation is async requiring polling get_job_status, and the returned documentId is used with verify_document. It does not explicitly name alternatives or say 'use this instead of X', but the contextual workflow is sufficiently directional.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attest_agent_outputA

Anchor agent-output provenance on the Midnight chain: "agent X produced output O from input I at time T". Builds the canonical v1 envelope server-side, hashes it and anchors it; the response returns the envelopeJson any third party can re-hash and check via verify_attestation, without trusting this server. Async: returns { jobId, status } immediately; poll get_job_status until succeeded or failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentIdYesAgent identity, ideally a registered grantee id
modelIdNoOptional model identifier
inputHashYesCommitment to the agent input (64 hex)
sessionIdYesWallet session id that signs and submits
outputHashYesCommitment to the produced output (64 hex)
policyHashNoOptional commitment to the governing policy (64 hex)
producedAtNoOptional ISO-8601 production time, defaults to now
storageRefNoWhere output/envelope live, defaults to agent-output://<agentId>
idempotencyKeyNoDedupes retries
contractAddressYesAttestationVault deployment
sponsorSessionIdNoOptional second session that pays the dust fee
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors: server-side envelope construction, hashing, anchoring, immediate async response with {jobId, status}, polling requirement, and the trust model ('without trusting this server'). It omits details like fees or permission requirements, but since no annotations exist, this is a solid disclosure of core behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two dense sentences that front-load the core purpose and then concisely explain the async flow. Every clause adds essential information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (12 parameters, async, no output schema), the description explains the initial response, the polling action, and the eventual deliverable (envelopeJson). It is slightly ambiguous about which response contains the envelopeJson, but overall it is sufficiently complete for an agent to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with meaningful descriptions, so the baseline is 3. The description adds conceptual mapping (agent X, output O, input I, time T) but provides no additional parameter-level guidance beyond what the schema already offers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action: 'Anchor agent-output provenance on the Midnight chain' and elaborates with the semantic 'agent X produced output O from input I at time T'. This clearly distinguishes the tool from siblings like verify_attestation and anchor_document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it is async, returns a jobId/status immediately, and instructs polling get_job_status until completion. It also mentions that third parties can verify via verify_attestation. However, it does not explicitly state when not to use this tool or name alternative attestation/document tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_statusA

Poll the status of an async NIGHTGATE job (all submit actions return a jobId). status: pending | running | external_execution | submitted | reconciliation_required | succeeded | failed. Poll every few seconds until succeeded or failed; result carries the job outcome JSON, chainStatus tracks on-chain finalization independently.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesJob id returned by a submit action
sessionIdYesWallet session id the job belongs to

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and does well: it discloses the async nature, the status enum, the recommended polling interval, that the result carries a job outcome JSON, and that chainStatus tracks on-chain finalization independently. Some details like error behavior or timeouts are omitted, so a 4 is fitting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose and statuses, followed by actionable polling guidance. No wasted words; every clause contributes necessary behavioral or workflow information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 fully-described parameters, no output schema, no annotations), the description covers essential aspects: why to use it, the status model, how to poll, and what the result contains. It lacks only minor details like error handling or timeout guidance, which are not critical for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already described in the schema. The description adds minor context (jobId comes from submit actions, sessionId belongs to the job) but does not significantly exceed schema semantics. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool polls the status of an async NIGHTGATE job, with a specific verb (poll) and resource (job status). It also lists all possible statuses, which unambiguously defines its scope and distinguishes it from sibling tools that verify or attest.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this after submit actions and provides a polling loop ('Poll every few seconds until succeeded or failed'). This is clear context, though it doesn't mention when not to use it or name alternatives; none of the siblings serve a polling role, so no exclusion is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

grant_disclosureA

Grant a disclosure level for an attestation to a grantee identity, on-chain via the AttestationVault. Attester-only: the transaction is rejected in-circuit unless the session wallet is the original attester. level: 0=public, 1=legitimate-interest, 2=authority. Async: returns { jobId, status } immediately; poll get_job_status until succeeded or failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelYes0=public, 1=legitimate-interest, 2=authority
granteeYesGrantee identity (64 hex Bytes<32>)
sessionIdYesWallet session id (must be the attester)
payloadHashYesThe attestation payload hash (64 hex)
idempotencyKeyNoDedupes retries
contractAddressYesAttestationVault deployment
sponsorSessionIdNoOptional second session that pays the dust fee
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the on-chain execution, the in-circuit rejection for non-attesters, and the async return shape with polling instructions. This goes beyond schema content and gives useful operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences, front-loaded with the core purpose. No fluff; every sentence contributes a distinct piece of information (purpose, constraint, async behavior).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 params, no output schema), the description covers the essential aspects: what it does, who can call it, and how to handle the async result. It leaves idempotency and fee sponsorship to the schema, which is acceptable given high schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage, so the baseline is 3. The description adds value by explaining the consequence for sessionId (transaction rejected unless original attester) and reiterating level meanings, slightly enhancing the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Grant') with a clear resource ('disclosure level for an attestation to a grantee identity') and specifies the mechanism ('on-chain via the AttestationVault'). This clearly distinguishes it from sibling tools like revoke_disclosure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the attester-only constraint and the async polling pattern, which tells the agent when this tool applies and how to follow up. It does not explicitly name alternatives, but the context is unambiguous enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prepare_document_proofA

Turn a structured document into everything the proof tools need: canonical JSON and its payloadHash (what anchor_document anchors), a Merkle contentRoot over an ORDERED list of up to 16 proof fields, and per-field inclusion paths ready for prove_field_predicate. Keep the field order stable across anchor and proof: it is part of the tree identity. Compute-only and synchronous, nothing is stored server-side. The returned fields carry witness material (scaled values): treat as sensitive. Store canonicalDocument at your storageRef; re-serializing with different key order will not re-hash equal.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentYesThe full document as a JSON object; all of it goes into payloadHash
proofFieldsYesORDERED list of fields to make provable (leaf index = position)
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses key behaviors: compute-only, synchronous, no server-side storage, sensitivity of witness material, and the critical non-re-hashing pitfall of re-serializing with different key order. This goes well beyond a basic read/write label.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, front-loaded with the main purpose, then adding essential behavioral notes. Every sentence contributes unique, high-value information without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema and annotations, the description adequately explains what the tool returns (canonical JSON, payloadHash, contentRoot, inclusion paths) and its place in the larger workflow. It covers usage caveats and output sensitivity, making it sufficiently complete for an AI agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with detailed descriptions for all parameters (document, proofFields, compiledArtifactRef). The description adds contextual relationships (e.g., 'what anchor_document anchors') but doesn't materially enhance parameter semantics beyond the schema's existing clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb ('Turn... into'), enumerating the concrete outputs (canonical JSON, payloadHash, Merkle contentRoot, inclusion paths). It explicitly names downstream tools (anchor_document, prove_field_predicate), distinguishing it from siblings as a preparatory step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context that this is a prerequisite for proof/anchor tools, with usage guidance on preserving field order and storing canonicalDocument correctly. While it doesn't explicitly say when not to use it, the downstream references imply a specific place in the workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prove_field_predicateA

Issue a zero-knowledge field-bound predicate proof: prove that a hidden field of an anchored document satisfies "value <= threshold" or "value >= threshold" WITHOUT revealing the value. Needs the depth-4 Merkle inclusion path of the field in the anchored content root. value/threshold are scaled integers (decimal strings); the value is a witness and never persisted. If contentRoot is supplied it is anchored first. A false predicate fails at local proving time, nothing is submitted. Async: returns { jobId, status } immediately; poll get_job_status until succeeded or failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
dirsYesExactly 4 booleans; true means the current node is the LEFT child
unitNoInformational unit, e.g. kWh
valueYesScaled integer field value (witness only, never persisted)
fieldKeyYesCanonical field id (64 hex, public)
siblingsYesDepth-4 Merkle inclusion path: exactly 4 sibling digests (64 hex each)
predicateYesPredicate operator
sessionIdYesWallet session id that signs and submits
thresholdYesScaled integer threshold (same scaling as value)
contentRootNoOptional Merkle root (64 hex) to anchor first
payloadHashYesAttestation payload hash (64 hex)
idempotencyKeyNoDedupes retries
contractAddressYesAttestationVault deployment
sponsorSessionIdNoOptional second session that pays the dust fee
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and fulfills it thoroughly: it discloses the zero-knowledge property, that the value is a witness and never persisted, that a false predicate fails locally with nothing submitted, and the immediate async return. It also adds context about scaling and contentRoot anchoring, offering a comprehensive behavioral profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the first sentence states the primary function, subsequent sentences cover prerequisites, scaling, anchoring, failure behavior, and the async pattern. The description is tightly written with no fluff and is appropriately front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 14-parameter tool with no output schema, the description covers the core aspects: purpose, prerequisites, behavioral nuances, and the return format. It could further describe error scenarios or the verification flow, but the essential operational context is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining the scaled integer semantics for value and threshold, the witness-only role of value, the depth-4 Merkle path requirement for siblings/dirs, and the contentRoot anchoring behavior. This enriches the parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb phrase 'Issue a zero-knowledge field-bound predicate proof' and precisely defines the predicate as 'value <= threshold' or 'value >= threshold' while emphasizing non-revelation. It clearly differentiates from verification siblings (verify_*) by focusing on proof generation, and the singular 'field' distinguishes it from the plural sibling 'prove_field_predicates_batch'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete usage context: it requires the depth-4 Merkle inclusion path, explains the optional contentRoot anchoring behavior, and describes the async flow with get_job_status polling. It does not explicitly name the batch alternative or state 'when not to use', but the strong contextual detail makes the intended use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prove_field_predicates_batchA

Batch variant of prove_field_predicate: prove up to 8 field-bound predicates on ONE anchored document in ONE transaction (7 if contentRoot is supplied, since the anchor occupies one call slot). Duplicate claim tuples are dropped server-side. One false predicate aborts the whole batch at local proving time with zero on-chain effect. After submission the chain can finalize a PARTIAL_SUCCESS subset; verify per claim via verify_predicate_attestation instead of assuming all-or-nothing. Async: returns { jobId, status } immediately; poll get_job_status until succeeded or failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
claimsYes1-8 claims on the same payload hash
sessionIdYesWallet session id that signs and submits
contentRootNoOptional Merkle root anchored as first call of the same batch
payloadHashYesShared attestation payload hash (64 hex)
idempotencyKeyNoDedupes retries
contractAddressYesAttestationVault deployment
sponsorSessionIdNoOptional second session that pays the dust fee
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility and excels: it discloses duplicate tuples dropped server-side, whole-batch abort on false predicate with zero on-chain effect, possible PARTIAL_SUCCESS subset, and async behavior returning { jobId, status } to poll via get_job_status. This is thorough and policy-relevant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences deliver the core purpose, edge cases, failure modes, and async pattern without redundancy. Every sentence adds value and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the batch complexity, partial-success behavior, and absence of an output schema, the description is highly complete: it covers the claim limit, duplicate handling, abort semantics, verification path, and async polling contract. Sibling tools round out the context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline 3 applies. The description adds the 8-claim cap and the contentRoot slot trade-off, but does not otherwise enrich parameter meaning beyond what the schema already explains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Batch variant of prove_field_predicate' and specifies 'prove up to 8 field-bound predicates on ONE anchored document in ONE transaction', which clearly states the tool's action, scope, and distinguishes it from the singular sibling prove_field_predicate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It identifies itself as a batch variant, implying use when multiple predicates are needed, and advises verifying per-claim via verify_predicate_attestation after partial success. However, it does not explicitly state when to prefer this over prove_field_predicate or exclude single-predicate cases, leaving that to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_disclosureA

Revoke a previously granted disclosure on-chain (removes the grantee entry). Attester-only, enforced in-circuit. Async: returns { jobId, status } immediately; poll get_job_status until succeeded or failed.

ParametersJSON Schema
NameRequiredDescriptionDefault
granteeYesGrantee identity (64 hex Bytes<32>)
sessionIdYesWallet session id (must be the attester)
payloadHashYesThe attestation payload hash (64 hex)
idempotencyKeyNoDedupes retries
contractAddressYesAttestationVault deployment
sponsorSessionIdNoOptional second session that pays the dust fee
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden of behavioral disclosure. It explicitly states the on-chain effect ('removes the grantee entry'), the permission model ('Attester-only, enforced in-circuit'), and the async pattern with a clear follow-up mechanism. It stops short of detailing failure modes or response statuses, but the provided information is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences: the first explains the action and effect, the second explains the async behavior and next step. No redundancy, information is front-loaded, and every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex async on-chain mutation with 7 parameters and no output schema, this description covers the essential contract: what it does, who can call it, and how to track completion. It does not enumerate possible failure statuses, but that is reasonably delegated to get_job_status, making it complete enough for an agent to invoke and monitor correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema describes all 7 parameters with 100% coverage, so the baseline is 3. The tool description adds no param-specific meaning beyond what the schema already provides, but it does not need to compensate since the schema is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Revoke a previously granted disclosure on-chain'), identifies the resource (the grantee entry), and clearly differentiates from sibling grant_disclosure by using 'previously granted' and 'removes'. The verb is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational context: 'Attester-only' establishes who can invoke it, and the async instruction to poll get_job_status gives actionable next steps. However, it does not explicitly name alternatives or when-not-to-use scenarios, though the verb 'revoke' makes the intended use case obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_attestationA

Verify against LIVE Midnight contract state that a payload hash is attested in an AttestationVault (crawler-free, no txHash needed). Optionally also checks that the anchored content root matches. Returns verified:false (not an error) when absent.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNoRead from another network public indexer instead of the configured one
contentRootNoOptional anchored content root to check (64 hex)
payloadHashYesThe attested payload hash (sha256, 64 hex)
contractAddressYesAttestationVault contract address
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description discloses important behavioral traits: it reads LIVE state, returns verified:false (not an error) when absent, and optionally checks content root. This is substantive, though it does not address all possible behaviors (e.g., network handling, error conditions).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two well-structured sentences that front-load the core purpose. No wasted words; each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema, the description explicitly clarifies the return behavior for the absent case, which is important. It also explains the key differentiators. It does not cover every nuance, but the schema fills in parameter details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all five parameters with 100% coverage, so the description adds only a little extra meaning by linking 'contentRoot' to 'anchored content root' and implying payloadHash. This matches the baseline for good schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action (verify) and resource (LIVE Midnight contract state, AttestationVault), and specifies that it checks payload hash attestation. It also distinguishes from sibling tools like verify_predicate_attestation by highlighting 'crawler-free, no txHash needed'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides useful context by noting it is crawler-free and does not require a txHash, which hints at appropriate use cases. However, it does not explicitly name alternatives or state when not to use this tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_documentA

Verify an anchored document by its NIGHTGATE document id: compares the provided sha256 against the anchored original and confirms the anchoring transaction, with a crawler-free live-state fallback when contractAddress is supplied.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesDocuments row id
providedSha256Yessha256 of the document to check (64 hex)
contractAddressNoOptional vault address, enables the crawler-free fallback
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden of behavioral disclosure. It reveals the core verification steps and the fallback behavior, but does not mention whether the operation is read-only, potential error conditions, or the shape of the return value. It gives useful insight without full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that begins with the action and resource, followed by the mechanism and the fallback condition. Every phrase adds value, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (4 parameters, no output schema, no annotations), the description covers the essential purpose, the mechanism, and the conditional fallback. It does not describe the return format, but for a verification tool the output is likely self-evident. The description is sufficient for correct selection and initial invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all parameters, so the baseline is 3. The description adds context beyond the schema by introducing 'NIGHTGATE document id' and the fallback condition tied to contractAddress, which clarifies the domain and the conditional behavior. This adds meaningful semantics over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Verify') and resource ('anchored document'), identifies the primary identifier ('NIGHTGATE document id'), and explains the verification mechanism (comparing sha256 and confirming the anchoring transaction). This clearly distinguishes the tool from sibling verification tools focused on predicates or attestations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the main use case (verifying an anchored document by document id) and provides a conditional alternative ('crawler-free live-state fallback when contractAddress is supplied'). It does not explicitly say when not to use this tool versus siblings, but the focus on documents is implied. This is clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_predicateA

Verify against LIVE Midnight contract state that a ZK predicate proof (e.g. "hidden value <= threshold") was recorded true on-chain. Id-free: works for proofs NIGHTGATE never saw. threshold must be the SAME scaled integer the circuit hashed (scaling mismatch yields verified:false). Supply fieldKey for a field-bound proof, omit it for a plain one.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNoRead from another network public indexer instead of the configured one
fieldKeyNoOptional field key (64 hex) for field-bound proofs
predicateYesPredicate operator
thresholdYesScaled circuit integer threshold (same scaling the circuit hashed)
payloadHashYesThe attestation payload hash (64 hex)
contractAddressYesAttestationVault contract address
compiledArtifactRefNoContract artifact ref, defaults to 'attestation-vault'

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description covers behavioral traits: it reads live contract state, is id-free, and warns about scaling mismatch causing verified:false. This is useful caveat-level transparency, though it stops short of describing return shape or other edge-case behaviors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all front-loaded and information-dense. The primary action is stated first, followed by the id-free differentiation, then the scaling warning and fieldKey instruction. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose, key caveat, and param conditioning. It lacks explicit return value details (e.g., whether the response is a simple boolean or includes proof metadata), but given no output schema, it still gives enough to invoke the tool. Minor gap for a verification tool where result interpretation matters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Though schema coverage is 100%, the description adds critical param semantics: threshold must be the same scaled integer the circuit hashed, and fieldKey distinguishes field-bound vs plain proofs. This directly supplements the schema entries and prevents misuse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete action: verifying against LIVE Midnight contract state that a ZK predicate proof was recorded true on-chain. It clearly identifies the resource (on-chain state), the verb (verify), and the specific proof form (predicate), while the 'Id-free' distinction separates it from sibling tools like verify_predicate_attestation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives practical usage context: works for proofs NIGHTGATE never saw (id-free), and explains when to supply or omit fieldKey. It does not explicitly name alternative tools or exclusions, but the 'Id-free' note implies a differentiation from attestation-bound verifiers, making the guidance clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_predicate_attestationA

Verify a server-issued predicate attestation by its NIGHTGATE row id (UUID). Confirms the proving transaction succeeded, with a crawler-free live-state fallback. Use verify_predicate instead when you only have on-chain coordinates.

ParametersJSON Schema
NameRequiredDescriptionDefault
predicateAttestationIdYesPredicateAttestations row id

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, but the description discloses meaningful behavior: it confirms the proving transaction succeeded and mentions a 'crawler-free live-state fallback.' It could add return/error details, but the essentials of the read-only verification operation are conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two terse sentences: first states action and mechanism, second gives alternative. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter verify tool without output schema, the description covers purpose, input semantics, and fallback behavior. It lacks explicit output/return shape, but the phrase 'Confirms... succeeded' implies the verification result, and complexity is low.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a standard UUID field, and the description adds the operational meaning: 'NIGHTGATE row id' and 'server-issued predicate attestation,' clarifying what to pass beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific verb 'Verify' and resource 'server-issued predicate attestation' identified by NIGHTGATE row id, and explicitly contrasts with verify_predicate for on-chain coordinates. This clearly distinguishes it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names the alternative 'verify_predicate' and the condition ('when you only have on-chain coordinates'), and implicitly states when to use this tool (when you have the NIGHTGATE row id). This is strong guidance for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.1.0
    • First observedanchor_document
    • First observedattest_agent_output
    • First observedget_job_status
    • First observedgrant_disclosure
    • First observedprepare_document_proof
    • First observedprove_field_predicate
    • First observedprove_field_predicates_batch
    • First observedrevoke_disclosure
    • First observedverify_attestation
    • First observedverify_document
    • First observedverify_predicate
    • First observedverify_predicate_attestation

TDQS

A4.4/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but the four verify-* tools (verify_predicate_attestation, verify_attestation, verify_predicate, verify_document) all perform verification with different inputs and contexts, which could cause some confusion. However, the detailed descriptions help differentiate them, so it's mostly clear.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using lowercase and underscores, such as verify_predicate, anchor_document, grant_disclosure, and get_job_status. This makes the naming predictable and easy to understand.

Tool Count5/5

With 12 tools, the server provides a well-scoped set of operations for its domain: anchoring, proving, verifying, and disclosure management. The number is appropriate and each tool serves a distinct purpose without redundancy.

Completeness4/5

The tool set covers the core lifecycle: anchoring documents and agent outputs, proving predicates (single and batch), verifying various attestations, and managing disclosures. Minor gaps exist, such as no dedicated tool for proving plain (non-field-bound) predicates and no listing/querying of all attestations, but these are workaroundable.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for AI agent identity — verify agents with Ed25519 signatures, check trust scores, sign and verify content, exchange encrypted messages. Built on the Agent Identity Protocol (AIP).
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for AI agent guardrails — validates and signs agent decisions (OAA tokens) so third parties can verify them without server access
    3
    19 PyPI
    1
    MIT