@odatano/nightgate-mcp
OfficialMCP server for the NIGHTGATE Midnight attestation layer: anchor documents, prove zero-knowledge claims over hidden fields, and verify records against live contract state.
Verify anchors, ZK predicates, server-issued predicate attestations, and documents against live Midnight contract state (absent records return
verified: false, not an error).Anchor a document's sha256 + metadata on-chain, or anchor an agent-output provenance envelope (agent/model/input/output hashes) — both async jobs.
Prepare proof inputs: canonical JSON, payloadHash, a Merkle contentRoot over an ordered field list, and depth-4 inclusion paths (compute-only, nothing stored).
Issue ZK field-bound predicate proofs (
<=/>=over a hidden scaled value) singly or batched up to 8 claims in one transaction, without revealing the value.Grant or revoke on-chain disclosure ACL entries for a grantee (levels 0=public, 1=legitimate-interest, 2=authority), attester-only.
Poll any async job via
get_job_statusuntil succeeded/failed, tracking on-chain finalization.The README also describes tools not present in this schema: fee sponsoring, shielded swaps and an offer board, token minting, holder disclosure, and analytics.
Provides tools for querying Midnight blockchain aggregates through the ODATANO ASTRA analytics service.
Provides tools for interacting with the Cardano blockchain, including key management and transactions via the ODATANO platform.
Enables running a self-hosted NIGHTGATE instance via a provided Docker image.
The server is a Node.js package, requiring Node.js >= 20 as its runtime.
The server is distributed as an npm package (@odatano/nightgate-mcp) and can be installed and run via npx or npm.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@odatano/nightgate-mcpProve that the salary field is above 50000 without disclosing it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@odatano/nightgate-mcp
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 |
| Check records and ZK claims against live contract state; absent = |
| Build proof inputs: salted content tree, set root |
| Anchor a document hash or an agent-output envelope (async) |
| ZK claims over one hidden field (async) |
| Up to 8 claims in one transaction (async) |
| ZK claims across two documents (async) |
| On-chain disclosure ACL (async) |
| Build, prove and sign locally; the attester id and shielded keys it builds under |
| Hand locally built bytes to a sponsor that pays and submits (async) |
| Shielded coins of the local wallet; what an offer gives and wants |
| Build one half of a shielded swap locally, take an offer, release a half |
| Hand both halves of a swap, or a board offer plus the taker half, to a sponsor that merges, pays and submits (async) |
| The server's offer board: post a maker half, find open offers, take yours down |
| Follow one offer, see your own posts and their fills, read the board's counts without credentials |
| 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) |
| Disclose a document to the holders of a token; read it with the secret behind a registered claim key |
| Token type a minting contract produces |
| Poll an async job; batches report |
| Midnight aggregates via ODATANO ASTRA, when the host serves it |
Errors carry the server's HTTP status and code (INVALID_ARGUMENT, ...).
Fee sponsoring
build_sponsorable_transactionbuilds and proves the call locally (needs@odatano/nightgate-txinstalled next to the server andNIGHTGATE_SEED_HEX).sponsor_unbound_transactionwith a sponsor session id or the platform pool id00000000-0000-0000-0000-706f6f6c0000.get_job_statuswith the returnedsessionId, thenverify_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.
get_swap_wallet: balance, free coins andspendableper token type. The first call starts the sync of the shielded coins (about 5 minutes from genesis, seconds withNIGHTGATE_SWAP_STATE_FILE).Maker:
build_swap_offerwithgiveandwantreturns the offer file (swapoffer1...) to publish, orpost_swap_offerputs it on the server's board.Taker:
list_swap_offersorread_swap_offer, thentake_swap_offerwithexpect, asponsorSessionIdand, for a board entry, itsofferId. It builds the mirror half and submits both.get_job_statuswith the returnedsessionId; the result carriesswap. The maker follows the offer withget_swap_offerormy_swap_offers(filled+filledTxHash);list_swap_offerswithstatus: allandsinceis the board's change feed.
One half spends at most
NIGHTGATE_SWAP_MAX_INPUTScoins, the smallest that fit.give.amountabovespendableis refused before proving.An offer fills once. Its coins stay reserved in the maker's wallet until the swap lands or
revert_swap_offerreleases them.A refused submission keeps the proven half:
sponsor_swapwith itshalfId.The sponsor needs swaps switched on and both token types on its list; an agent grant needs
sponsorSwapinallowedActions.With
NIGHTGATE_PROOF_SERVER_URLthe proof server sees the coins a half spends: use one you run yourself.Tokens to swap:
mint_tokenmints on a token factory to this wallet (or any other wallet, given both of its keys). Without asessionIdthe seed is the issuer: the mint is built and proven here (needs@odatano/contract-token-factorynext 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_statussays whether a sponsor is ready before anything is built.
Configuration
Variable | Default | Purpose |
| unset |
|
|
| Gateway or a direct NIGHTGATE host |
| unset | Basic auth of a direct instance |
| unset | Seed (128 hex) for local building and swaps; never a tool argument |
|
| Network of the local builder |
| unset | Prove on a proof server instead of in-process |
| unset | File for the swap wallet's state; it holds the wallet's coins, keep it like a key |
|
| Most coins one swap half spends; the sponsor's limit applies |
|
| 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:latestThen 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 integrationLive 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-unboundLicense
Apache-2.0
Available Tools
12 toolsanchor_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.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Content size in bytes, informational | |
| sha256 | Yes | sha256 of the document content (64 hex), becomes the on-chain payload hash | |
| metadata | No | Public metadata object; its hash is anchored alongside | |
| sessionId | Yes | Wallet session id that signs and submits | |
| storageRef | Yes | Where the bytes live, e.g. file://, s3://, ipfs:// | |
| contentType | No | MIME type, informational | |
| idempotencyKey | No | Dedupes retries of the same anchor request | |
| contractAddress | Yes | AttestationVault deployment to anchor into | |
| sponsorSessionId | No | Optional second session that pays the dust fee | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes | Agent identity, ideally a registered grantee id | |
| modelId | No | Optional model identifier | |
| inputHash | Yes | Commitment to the agent input (64 hex) | |
| sessionId | Yes | Wallet session id that signs and submits | |
| outputHash | Yes | Commitment to the produced output (64 hex) | |
| policyHash | No | Optional commitment to the governing policy (64 hex) | |
| producedAt | No | Optional ISO-8601 production time, defaults to now | |
| storageRef | No | Where output/envelope live, defaults to agent-output://<agentId> | |
| idempotencyKey | No | Dedupes retries | |
| contractAddress | Yes | AttestationVault deployment | |
| sponsorSessionId | No | Optional second session that pays the dust fee | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | Job id returned by a submit action | |
| sessionId | Yes | Wallet session id the job belongs to |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| level | Yes | 0=public, 1=legitimate-interest, 2=authority | |
| grantee | Yes | Grantee identity (64 hex Bytes<32>) | |
| sessionId | Yes | Wallet session id (must be the attester) | |
| payloadHash | Yes | The attestation payload hash (64 hex) | |
| idempotencyKey | No | Dedupes retries | |
| contractAddress | Yes | AttestationVault deployment | |
| sponsorSessionId | No | Optional second session that pays the dust fee | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | The full document as a JSON object; all of it goes into payloadHash | |
| proofFields | Yes | ORDERED list of fields to make provable (leaf index = position) | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dirs | Yes | Exactly 4 booleans; true means the current node is the LEFT child | |
| unit | No | Informational unit, e.g. kWh | |
| value | Yes | Scaled integer field value (witness only, never persisted) | |
| fieldKey | Yes | Canonical field id (64 hex, public) | |
| siblings | Yes | Depth-4 Merkle inclusion path: exactly 4 sibling digests (64 hex each) | |
| predicate | Yes | Predicate operator | |
| sessionId | Yes | Wallet session id that signs and submits | |
| threshold | Yes | Scaled integer threshold (same scaling as value) | |
| contentRoot | No | Optional Merkle root (64 hex) to anchor first | |
| payloadHash | Yes | Attestation payload hash (64 hex) | |
| idempotencyKey | No | Dedupes retries | |
| contractAddress | Yes | AttestationVault deployment | |
| sponsorSessionId | No | Optional second session that pays the dust fee | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| claims | Yes | 1-8 claims on the same payload hash | |
| sessionId | Yes | Wallet session id that signs and submits | |
| contentRoot | No | Optional Merkle root anchored as first call of the same batch | |
| payloadHash | Yes | Shared attestation payload hash (64 hex) | |
| idempotencyKey | No | Dedupes retries | |
| contractAddress | Yes | AttestationVault deployment | |
| sponsorSessionId | No | Optional second session that pays the dust fee | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| grantee | Yes | Grantee identity (64 hex Bytes<32>) | |
| sessionId | Yes | Wallet session id (must be the attester) | |
| payloadHash | Yes | The attestation payload hash (64 hex) | |
| idempotencyKey | No | Dedupes retries | |
| contractAddress | Yes | AttestationVault deployment | |
| sponsorSessionId | No | Optional second session that pays the dust fee | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Read from another network public indexer instead of the configured one | |
| contentRoot | No | Optional anchored content root to check (64 hex) | |
| payloadHash | Yes | The attested payload hash (sha256, 64 hex) | |
| contractAddress | Yes | AttestationVault contract address | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| documentId | Yes | Documents row id | |
| providedSha256 | Yes | sha256 of the document to check (64 hex) | |
| contractAddress | No | Optional vault address, enables the crawler-free fallback | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Read from another network public indexer instead of the configured one | |
| fieldKey | No | Optional field key (64 hex) for field-bound proofs | |
| predicate | Yes | Predicate operator | |
| threshold | Yes | Scaled circuit integer threshold (same scaling the circuit hashed) | |
| payloadHash | Yes | The attestation payload hash (64 hex) | |
| contractAddress | Yes | AttestationVault contract address | |
| compiledArtifactRef | No | Contract artifact ref, defaults to 'attestation-vault' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| predicateAttestationId | Yes | PredicateAttestations row id |
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.1.0- First observed
anchor_document - First observed
attest_agent_output - First observed
get_job_status - First observed
grant_disclosure - First observed
prepare_document_proof - First observed
prove_field_predicate - First observed
prove_field_predicates_batch - First observed
revoke_disclosure - First observed
verify_attestation - First observed
verify_document - First observed
verify_predicate - First observed
verify_predicate_attestation
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Hosted AgentLux MCP server for marketplace, identity, creator, services, and social flows.
MCP server for verifying EUDI/Talao wallet data via OIDC4VP (pull) for AI agents.
MCP server connecting AI agents to non-custodial staking data across 130+ networks.
Hosted MCP server for live Bittensor chain reads and self-custodial on-chain writes.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP 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).8MIT
- AlicenseNot gradedqualityDmaintenanceMCP Server for AI agent identity and authorization. Create, verify, and manage agent identities with trust scores and scoped authorization tokens.MIT
- AlicenseAqualityCmaintenanceMCP server that gives AI assistants access to Midnight blockchain—search contracts, analyze code, and explore documentation.3024 npm37MIT
- AlicenseAqualityAmaintenanceMCP server for AI agent guardrails — validates and signs agent decisions (OAA tokens) so third parties can verify them without server access319 PyPI1MIT