Tersign Evidence
NPM · TERSIGN
The record layer for the machine age: counter-signed receipts and agent action records.
Available components
Last scanned (7 hours ago)
Scores higher than 91% of npm servers
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security81
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects zod 3.25.76, a direct dependency. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- 30 of 109 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to tersignhq/tersign-js). View diagnostics → Pass
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 8 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability63
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3241 tokens (~360/item across 9 items; 9 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 28 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 27 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Stability: 0.97 → pass security
- Package version: 0.6.7 → 0.6.8 functional
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 25 Oct 26 −1
- Stability: pass → 0.93 functional
- 24 Oct 26 −6
- CVE-2023-54404 affects this package: high ▼ security
- Known CVEs: pass → fail ▼ security
- 23 Oct 26 +1
No change was recorded against any check on this day. Supply Chain Security went from 98 to 99.
- 19 Oct 26 0
- Stability: 0.97 → pass security
- 18 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/tersign@0.6.8
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | tersignhq/tersign-js |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/tersignhq/tersign-js/.github/workflows/publish.yml@refs/tags/v0.6.8 |
| Rekor log index | 3514090200 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:d19fa93df4fb25f2f4bf14b3342cfe2550ce1b7c5ec547d9ef32ee5f55d9a57cc691d7608d6dcd05ab0f3e0799b8072773a348544ada1ed92b2d8ca98 |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 1 finding
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-mrhx-c7xc-m3w5 | CVE-2023-54404 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 109 packages
| Packages resolved | 109 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
adjudicate_dispute Run dispute triage ~559
Run deterministic triage on an open dispute and record the result. Triage applies fixed rules, stated here, to the dispute record: R1 (duplicate_charge) looks up the receipts the ledger counter-signed for the same seller, payer and settlement transaction hash, reading the hash only in 0x-prefixed 64-hex-digit form and the payer only in 0x-prefixed 40-hex-digit form (either letter case), and lists at most 16 of those receipts, the earliest ones and the disputed one (on a settlement of more than 16 the rationale says "more than 16 receipts" and which are listed, and adjudicationInputs carries sameSettlementTruncated: true), and classifies the disputed receipt refund when an earlier one shares that hash and uphold otherwise; R2 (not_delivered, wrong_content) classifies the claim refund when the seller filed no evidence before the evidence deadline; anything else, including a duplicate_charge receipt without a settlement transaction hash or a payer in those forms, is marked escalated with no result, for an external venue the parties choose. R1 reads receipts from one seller to one payer that share one settlement transaction as one payment. The rules never read the content, kind or note of any evidence, or the claimant's statement; no discretion and no model are involved, and the same inputs always produce the same result and rationale. The result is a triage classification recorded as data: it is not an adjudication, award or legal conclusion, it decides no legal claim, and it binds no one unless the parties separately agree. Side effects: writes the result to the dispute record, signed by the ledger; a refund result also logs a PENDING refund entry against the receipt for the claimed amount (not counter-signed into the chain; no payment is checked and no money moves). Runs once: the first successful call closes the dispute to evidence, and every later call returns 409. This tool sends no API key, so a not_delivered or wrong_content dispute can be triaged only after it…
| Name | Type | Req | Description |
|---|---|---|---|
| disputeDigest | string | yes | 0x-prefixed digest of the open dispute to triage, as returned by open_dispute |
No output schema declared.
No examples provided.
get_dispute Get dispute record ~121
Fetch a dispute in full: its status, claim and evidence deadline, both sides' signed evidence references, and, once triage has run, the triage result (verdict: refund, uphold, or null when escalated), its rationale, the inputs the rules ran on, and the ledger signature over the result. Read-only — one network read, no key required, and safe to poll while a dispute is open.
| Name | Type | Req | Description |
|---|---|---|---|
| disputeDigest | string | yes | 0x-prefixed digest of the dispute to fetch, as returned by open_dispute |
No output schema declared.
No examples provided.
issue_receipt Issue signed receipt ~476
Issue an x402 offer-receipt (EIP-712) plus a Tersign compliance record (returned as `compliance`; verify_compliance_record checks it) for a payment that has ALREADY settled; when a ledger is configured, the ledger counter-signs the receipt into your hash chain, while the compliance-fields record is not counter-signed and is bound to its receipt only by your own signature, which covers the receipt's digest. Use this for money that moved; use record_disclosure for a non-payment agent action. Recording only: it moves no money and executes no payment. Side effects: signs with your signing key (the one set in the Tersign plugin's settings in Claude Code, or the TERSIGN_* environment variables, else the one generated and kept locally on first run), and performs ONE network write to the ledger when a ledger URL, API key and seller id are set there too (without them it signs locally and returns an unchained artifact). Returns the signed receipt artifact, its keccak256 canonical digest, and — when chained — the ledger counter-signature and sequence number.
| Name | Type | Req | Description |
|---|---|---|---|
| currency | string | – | settlement currency code, e.g. "USDC" or "USD" |
| network | string | yes | settlement network as CAIP-2, e.g. "eip155:8453" for Base mainnet |
| payer | string | yes | 0x address that paid — the party who can later open a dispute against this receipt |
| principal | string | – | the party on whose authority the paying agent acted (x402 sense: the buyer who delegated). Omit when a human paid directly |
| resourceUrl | string | yes | absolute URL of the resource that was paid for; appears verbatim in the receipt |
| settledAt | integer | – | unix seconds when settlement occurred; defaults to now. Set it explicitly when back-filling |
| supplyDescription | string | yes | what was supplied, in the seller's own words; the human-readable line an auditor or venue reads |
| taxScheme | string | – | tax regime the seller is accounting under; recorded, never computed — Tersign does not calculate tax |
| txHash | string | – | on-chain settlement transaction hash, when one exists; omit for off-chain or fiat settlement |
No output schema declared.
No examples provided.
open_dispute Open dispute ~438
Open an objective dispute against a counter-signed receipt as the PAYER (the configured key must be the receipt payer). Reasons: not_delivered, wrong_content, duplicate_charge. Recording only: the ledger records your signed claim and opens an evidence window; it moves no money. The ledger opens a dispute only with room reserved in its dispute capacity for the claim, its triage and each party's first evidence item, the same on every plan; while that capacity is full it opens none (HTTP 503). adjudicate_dispute later runs deterministic triage on it, which classifies a duplicate_charge from the ledger's own receipts only when the disputed receipt carries a settlement transaction hash in 0x-prefixed 64-hex-digit form (either letter case), and escalates it otherwise; classifies an unanswered claim from the seller's silence; and marks anything else escalated, for an external venue the parties choose. Triage's duplicate_charge rule, R1, reads receipts from one seller to one payer that share one settlement transaction as one payment.
| Name | Type | Req | Description |
|---|---|---|---|
| claimAmount | string | yes | amount claimed back, as a decimal STRING in the receipt's settlement currency, e.g. "12.50". The ledger records it as stated and checks it against no payment; a refund triage result logs this amount… |
| reason | string | yes | grounds: 'not_delivered' nothing arrived · 'wrong_content' delivered but not what was bought · 'duplicate_charge' the same supply was billed twice (classified by triage from the ledger's own receipts… |
| receiptDigest | string | yes | 0x-prefixed keccak256 digest of the counter-signed receipt being disputed |
| statement | string | – | for humans reading the record — never an input to the triage rules |
No output schema declared.
No examples provided.
record_disclosure Record counter-signed disclosure ~266
One-call disclosure evidence (EU AI Act Art 50 dialect): digests the disclosure text LOCALLY, signs an action record with your key, and the public ledger counter-signs it into your per-signer hash chain. It moves no money. No API key needed — the first call self-provisions a free signer-keyed account, except when your key is already registered to an API-key account (409) or the daily provisioning caps are reached (429; https://tersign.ai/pricing).
| Name | Type | Req | Description |
|---|---|---|---|
| agentId | string | yes | stable identifier for the disclosing agent — keep it constant across calls so one chain accumulates per agent |
| kind | string | – | what was disclosed: 'ai-interaction' = the user was told they are talking to an AI; 'synthetic-content' = output was marked machine-generated. Defaults to 'ai-interaction' |
| medium | string | – | channel: 'chat' | 'api' | 'voice' | 'ui' … |
| resourceUrl | string | – | absolute URL of the surface the disclosure was presented on, when there is one |
| text | string | – | the disclosure text as presented — digested locally, never transmitted |
| textDigest | string | – | pre-computed digest (wins over text) |
No output schema declared.
No examples provided.
record_refund Record refund ~304
Log a refund against a receipt already on your chain, as the SELLER. The ledger stores it as a PENDING refund entry that references the original receipt digest; the entry is NOT counter-signed or appended to the hash chain, and it has no digest or sequence number of its own. Nothing is edited or deleted: the original receipt and its chain position stay exactly as they were. Requires a ledger URL, API key and seller id (the Tersign plugin's settings in Claude Code, or the TERSIGN_* environment variables) and performs one network write; errors if the original digest is not on your chain. This RECORDS a refund you have already made: it moves no money and executes no payment or refund. For a signed refund RECORD, build a compliance record with refundOf set to the original record digest (buildMinimalRecord in the SDK). Returns { id, status: "pending" }.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | refunded amount as a decimal STRING in the original settlement currency, e.g. "12.50". A string, not a number, so no precision is lost. Partial refunds are allowed |
| originalDigest | string | yes | 0x-prefixed keccak256 digest of the receipt being refunded — the digest returned by issue_receipt, and it must already exist on your chain |
| reason | string | yes | why the refund was issued, in your own words; recorded verbatim for whoever reads the chain later |
No output schema declared.
No examples provided.
submit_dispute_evidence Submit dispute evidence ~269
Submit signed evidence to an open dispute before its evidence deadline. Claimant evidence must be signed by the payer key; respondent evidence additionally requires the seller API key (the Tersign plugin's settings in Claude Code, or the TERSIGN_* environment variables). Each artifact is sent as its digest and kind, plus its time and note when given; its content never leaves your side. Triage (adjudicate_dispute) uses only whether each side filed, never the content, kind or note of what was filed; the evidence stays on the record for the parties and any external venue. It moves no money. Each party's first item on a dispute always fits the room reserved for it when the dispute opened; a later item is refused (HTTP 503) while the ledger's dispute capacity is full.
| Name | Type | Req | Description |
|---|---|---|---|
| artifacts | array | yes | at least one evidence reference; submit every artifact you want on the record in a single call |
| disputeDigest | string | yes | 0x-prefixed digest of the open dispute, as returned by open_dispute |
| role | string | yes | which side you are filing as: 'claimant' = the payer who opened it (payer key) · 'respondent' = the seller answering it (also needs the seller API key) |
No output schema declared.
No examples provided.
verify_compliance_record Verify compliance record ~451
Verify ONE record type: the compliance record that issue_receipt returns beside a receipt (`compliance`: a ComplianceRecordV1 `record` plus its ComplianceAttestation `attestation`, EIP-712 domain "compliance-fields"), fully OFFLINE (no network, no API key, no account): recompute the record's canonical digest, check that the attestation's signed payload names that exact digest and the same receiptDigest as the record, and recover the address that signed the attestation. It does NOT verify the disclosure record record_disclosure returns: that is a different record type (an action record, EIP-712 domain "tersign action-record"), and passed here it fails with a digest mismatch that says nothing about tampering. Use verify_receipt for the payment receipt itself. Without expectedSigner the signer is UNAUTHENTICATED and valid:true proves internal consistency only — anyone can edit a record, recompute its digest and re-sign the attestation with their own key, and still get valid:true with a different signer. Pass expectedSigner, obtained out-of-band, to bind authorship. Returns { verdict, valid, signer, signerStatus: BOUND | UNAUTHENTICATED | MISMATCH, signerBound, testKey? (a PUBLISHED test key — anyone can sign as it), digest (the recomputed record digest), reason? }. Read verdict first.
| Name | Type | Req | Description |
|---|---|---|---|
| attestation | object | yes | the attestation returned with it (`compliance.attestation`): the seller's EIP-712 signature over the record digest |
| expectedSigner | string | – | 0x address the record MUST be signed by: the SELLER's signing address (the key that signed the receipt and this record), obtained out-of-band — not the ledger's counter-signing key, which never signs… |
| record | object | yes | the compliance record exactly as issue_receipt returned it (`compliance.record`, ComplianceRecordV1 shape). Pass the object, not a JSON string; any field edit changes the digest and fails verificatio… |
No output schema declared.
No examples provided.
verify_receipt Verify signed receipt ~357
Verify an x402 offer-receipt artifact, fully OFFLINE (no network, no API key, no account; checks no ledger or chain): recover the address whose key produced its EIP-712 signature over the six signed payload fields (version, network, resourceUrl, payer, issuedAt, transaction), and compute its canonical digest (the content address a ledger records it under). Recovery yields SOME address for any payload, so without expectedSigner the signer is UNAUTHENTICATED: valid:true then proves neither who signed nor that the receipt is unmodified — an edited receipt recovers a different address and still returns valid:true. Pass expectedSigner, the issuer's address obtained out-of-band, to bind it: valid:true then means the signed fields were signed by that key; a mismatch returns valid:false with the recovered signer so you can see who actually signed. Use this for a receipt (money); use verify_compliance_record for the compliance record issue_receipt returns beside a receipt. Returns { verdict, valid, signer, signerStatus: BOUND | UNAUTHENTICATED | MISMATCH, signerBound, testKey? (the signer is a PUBLISHED test key — anyone can sign as it), digest, unsignedFields? (present in the artifact but not covered by the signature), reason? }. Read verdict first.
| Name | Type | Req | Description |
|---|---|---|---|
| artifact | object | yes | the receipt artifact exactly as issued: { format, payload, signature }. Pass the object, not a JSON string |
| expectedSigner | string | – | 0x address the receipt MUST be signed by — obtain it out-of-band, never from the artifact. Omit to recover the signer without binding it (it is then reported UNAUTHENTICATED) |
No output schema declared.
No examples provided.
How do I install the Tersign Evidence MCP server?
Tersign Evidence runs locally as an npm package, launched with npx -y tersign. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · tersign
claude mcp add tersignhq-evidence -- npx -y tersign
What is the Tersign Evidence MCP server?
Tersign Evidence is an MCP server listed in the public MCP registry as io.github.tersignhq/evidence. The record layer for the machine age: counter-signed receipts and agent action records. This page covers its npm package (tersign).
Is the Tersign Evidence MCP server safe to use?
Tersign Evidence scores 87 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Tersign Evidence MCP server expose?
Tersign Evidence exposes 9 tools: issue_receipt, verify_receipt, record_disclosure, verify_compliance_record, record_refund, and 4 more. Their descriptions and schemas cost roughly 3,241 tokens of context every time the server is loaded.
Is the Tersign Evidence MCP server still maintained?
Tersign Evidence is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Tersign Evidence MCP server under?
Tersign Evidence declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.