原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 MCP 服务器 · 用大白话讲清楚

Tersign Evidence

作者:tersignhq版本 0.6.8i★ –i在你的电脑上运行
注册名称io.github.tersignhq/evidence

安装

概览

作者提供的说明(英文原文)

The record layer for the machine age: counter-signed receipts and agent action records.

PopNx MCP 的三大支柱

这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。

它能帮你做什么

我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。

  • 连接方式: 在你的电脑上运行
  • 传输方式: stdio
  • 分类: 其他
  • 你需要填写:TERSIGN_SELLER_KEY, TERSIGN_LEDGER_API_KEY

安装

选择你使用的 AI 应用,然后复制设置。

安装之前

  • 基础检查:1 项中通过 1 项
  • 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
  • 需要你自己填写: TERSIGN_SELLER_KEY, TERSIGN_ISSUER_NAME, TERSIGN_ISSUER_JURISDICTION, TERSIGN_ISSUER_TAX_ID, TERSIGN_LEDGER_URL, TERSIGN_LEDGER_API_KEY, TERSIGN_LEDGER_SELLER_ID

标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。

你需要

  • npm已安装 Node.js(用于 npx 命令)

你用的是哪个应用?

在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。

打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json

{
  "mcpServers": {
    "evidence": {
      "command": "npx",
      "args": [
        "-y",
        "tersign"
      ],
      "env": {
        "TERSIGN_SELLER_KEY": "your-value",
        "TERSIGN_ISSUER_NAME": "your-value",
        "TERSIGN_ISSUER_JURISDICTION": "your-value",
        "TERSIGN_ISSUER_TAX_ID": "your-value",
        "TERSIGN_LEDGER_URL": "your-value",
        "TERSIGN_LEDGER_API_KEY": "your-value",
        "TERSIGN_LEDGER_SELLER_ID": "your-value"
      }
    }
  }
}

在终端中运行这条命令

claude mcp add evidence --env TERSIGN_SELLER_KEY=your-value --env TERSIGN_ISSUER_NAME=your-value --env TERSIGN_ISSUER_JURISDICTION=your-value --env TERSIGN_ISSUER_TAX_ID=your-value --env TERSIGN_LEDGER_URL=your-value --env TERSIGN_LEDGER_API_KEY=your-value --env TERSIGN_LEDGER_SELLER_ID=your-value -- npx -y tersign

运行前请先填写空着的值。

在 Cursor 中打开

或者自己复制设置

粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json

{
  "mcpServers": {
    "evidence": {
      "command": "npx",
      "args": [
        "-y",
        "tersign"
      ],
      "env": {
        "TERSIGN_SELLER_KEY": "your-value",
        "TERSIGN_ISSUER_NAME": "your-value",
        "TERSIGN_ISSUER_JURISDICTION": "your-value",
        "TERSIGN_ISSUER_TAX_ID": "your-value",
        "TERSIGN_LEDGER_URL": "your-value",
        "TERSIGN_LEDGER_API_KEY": "your-value",
        "TERSIGN_LEDGER_SELLER_ID": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

在 VS Code 中打开

或者自己复制设置

粘贴到项目中的 .vscode/mcp.json

{
  "servers": {
    "evidence": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "tersign"
      ],
      "env": {
        "TERSIGN_SELLER_KEY": "your-value",
        "TERSIGN_ISSUER_NAME": "your-value",
        "TERSIGN_ISSUER_JURISDICTION": "your-value",
        "TERSIGN_ISSUER_TAX_ID": "your-value",
        "TERSIGN_LEDGER_URL": "your-value",
        "TERSIGN_LEDGER_API_KEY": "your-value",
        "TERSIGN_LEDGER_SELLER_ID": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

需要你填写的值

  • TERSIGN_SELLER_KEY 机密 env
    Optional: your own 0x-prefixed signing key. Unset or empty, the server uses the key in the macOS keychain (tersign-signer) or ~/.tersign/signer.key, and generates one there on first run. The key neve…
  • TERSIGN_ISSUER_NAME env
    Seller/issuer display name
  • TERSIGN_ISSUER_JURISDICTION env
    Seller jurisdiction (e.g. HK)
  • TERSIGN_ISSUER_TAX_ID env
    Seller tax/business-registration id (optional)
  • TERSIGN_LEDGER_URL env
    Ledger base URL (optional). Needed by the dispute tools, and with the API key and seller id by record_refund and chained issue_receipt; record_disclosure defaults to https://tersign.ai
  • TERSIGN_LEDGER_API_KEY 机密 env
    Ledger seller API key (optional). With TERSIGN_LEDGER_URL and TERSIGN_LEDGER_SELLER_ID it enables record_refund and chained issue_receipt; with TERSIGN_LEDGER_URL it authenticates respondent dispute…
  • TERSIGN_LEDGER_SELLER_ID env
    Ledger seller id (optional). With TERSIGN_LEDGER_URL and TERSIGN_LEDGER_API_KEY it enables record_refund and chained issue_receipt.

这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。

它能做什么

它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。

基础检查i

我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过 GitHub 账户 tersignhq 验证,该账户拥有此仓库

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“其他”中的其他服务器比较i

  • 星标数多于此分类中其他 18372 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 18372 个服务器的 78% 更新
  • 基础检查结果等于或优于此分类中其他 18372 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

Tersign Evidence 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

你需要填写:TERSIGN_SELLER_KEY, TERSIGN_LEDGER_API_KEY

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(0.6.8)于11天前进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。

有什么可以替代它?

同一分类中有:Spec Driven Development, Remote Desktop Commander, A1RO — Irish employment tools

替代选择

同一分类中其他作者的服务器,按星标数排序。

如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i

Spec Driven Development

作者:formulahendry

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

在你的电脑上运行★ 440MIT14个月前更新
安装

Remote Desktop Commander

作者:desktop-commander

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

在云端运行★ 211前天更新
安装

作者的 README

打开 README

按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。

Tersign is the record layer for the machine age: what AI agents do and pay, counter-signed by a party outside the deal, anchored where no one can move it, checkable by anyone. *Machines can generate anything but the past.* Sellers sign EIP-712 receipts; Tersign chains them per seller and counter-signs every entry. When the dispute comes, the transcript is already sealed.

Venues rotate. The transcript endures.


Verify a Real Entry — Right Now

No account. No API key. This is the genesis receipt, seq 1 on the production chain. It is a self-signed demo: Tersign signed it as seller and named its own key as payer, so its EIP-712 payload signature (domain {name: "x402 receipt", version: "1", chainId: 1}, per the x402 offer-and-receipt extension) recovers to the payload's own payer, 0x36f82906859E5B0bd076069f8cdfAea355358b14. /v1/genesis serves the record with the recipe for each of its signatures.

npx tersign verify 0xe5874f1ffe87f0a6dd9eb157730f67b86ee4538b125fe30fcc4e165213dd3fc4
ledger:    https://tersign.ai

reports: found, counter-signed chain intact (seller tersign-first, seq 1, …) — not checked locally VALID (ledger-reported) — https://tersign.ai reports the record and its counter-signed chain; nothing was verified locally

npx tersign verify [--signer 0xaddr] [--ledger url] takes a receipt file or a digest.

  • A receipt file is checked locally and touches no network unless you add --ledger. The EIP-712 signature is recovered, and --signer compares it with the issuer's address, which you take from the issuer through a channel you trust, never from the receipt. Without --signer the signer is reported UNAUTHENTICATED and the verdict reads VALID (signer UNAUTHENTICATED): recovery yields an address for any payload, so an edited receipt reaches that same line with a different address.
  • A receipt signed with a published test key (the 20 Hardhat/Anvil default dev-mnemonic accounts, or private key 1, 2 or 3) is flagged published test key either way: anyone can produce that signature. Fields in the file that the signature does not cover are listed by name, and a signed field in another JSON type ("version": "1") is refused. The signature must be the one canonical encoding (0x + 130 lower-case hex digits, v 27/28, low-s): a re-encoding of a genuine signature (v 0/1, upper-case hex, the high-s twin) also recovers the issuer, under a different digest, so it is refused.
  • The file is a receipt, {receipt, record}, or an evidence-bundle record file (records/NNNNNN.json, verdict qualified record artifact only: its chain fields are not checked here). Anything else that nests a receipt — a second receipt at the top level, or any other field beside it — is refused, because a reader would take those fields for the receipt that was checked. Duplicate keys and non-integer numbers are refused too.
  • A digest is looked up on the Tersign ledger unless --ledger names another; the answer is that ledger's own counter-signed chain check, nothing in it is re-verified locally, and the verdict says so (VALID (ledger-reported)). The ledger consulted is always printed. The local check is the receipt file with --signer.

Exit status: 0 valid (read the last line — for a file, a bare VALID means a bound, non-test-key signer on a receipt or {receipt, record}; a digest is always VALID (ledger-reported)), 1 invalid, 2 usage (an unknown or valueless flag, --signer with a digest, a missing or non-JSON file). Prefer raw HTTP? The same proof, no CLI:

curl https://tersign.ai/v1/receipts/0xe5874f1ffe87f0a6dd9eb157730f67b86ee4538b125fe30fcc4e165213dd3fc4/verify

One-Call Disclosure Evidence

Counter-signed evidence that your agent presented a disclosure — one command, no account:

npx tersign disclose "You are chatting with an AI assistant." --medium chat --agent-id my-agent

The text is digested locally (only the digest travels — data-minimization by construction). Your key signs the record; the ledger counter-signs it into a per-signer hash chain whose head is submitted for Bitcoin anchoring on a six-hourly cron. The first call self-provisions a free signer-keyed account bound set-once to your key, unless that key is already registered to an API-key ledger account (409: submit through that account) or the day's provisioning caps are reached (429). Key resolution: TERSIGN_SELLER_KEY env → macOS keychain tersign-signer → ~/.tersign/signer.key, created on first use. Free tier is quota- and rate-limited — limits. What this is: independently verifiable evidence the disclosure was attested at that time. What it is not: a compliance certification.

Chain of Custody

Every entry takes the same path: the seller signs the receipt (EIP-712, x402 offer-receipt extension) → Tersign computes the keccak256 canonical digest → the digest joins that seller's hash chain, each seq n bound to seq n−1 → the neutral ledger counter-signs (secp256k1) → anyone verifies, and any venue gets a serialized envelope.

Since 2026-08-28 each anchor stamps a chain commitment — an accumulator over every counter-signed link — so one anchored digest covers the whole prefix; rows anchored earlier bind the head record only and say so (subjectSchema).

graph LR

A["agent transaction x402"] --> B["seller-signed receipt EIP-712"] B --> C["canonical digest keccak256"] C --> D["per-seller hash chain seq n binds seq n−1"] D --> E["neutral counter-signature secp256k1 ledger"] E --> F["verifiable by anyone venue-formatted envelope"]

Diagram renders on GitHub. On npm, the paragraph above IS the diagram.

A refund record references the record it corrects by digest (refundOf). Disputes attach to the digest with objective reason codes. Party statements are structurally segregated behind an UNVERIFIED marker — the evidence stays prompt-injection-hardened.

Enter the Record

npm i tersign

withAssure() wraps your x402 fetch handler. On a settled call it signs a receipt and a compliance-fields record with your key and merges both into the PAYMENT-RESPONSE header, the base64 JSON settlement response x402 wallets already read; the response body is left alone. When it cannot issue them (a settlement network that is neither CAIP-2 nor a v1 name in its table, such as "bsc", or a ledger error), the paid response goes out exactly as your handler returned it, with no receipt, and the error goes to onError (default: console.error); with idempotency on, a retry with the same payment id replays that response. On a 402 it adds compliance-fields to the PAYMENT-REQUIRED header. When the Assure is built with a ledger, the ledger counter-signs the receipt into your chain; 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. Without a ledger, both carry your signature alone.

import { privateKeyToAccount } from 'viem/accounts';

import { Assure, withAssure } from 'tersign';

const signer = privateKeyToAccount(process.env.TERSIGN_SELLER_KEY as 0x${string}); const assure = new Assure({ signer, issuer: { name: 'Example API Ltd', jurisdiction: 'HK' } }); export default { fetch: withAssure(app.fetch, { assure }) }; // app: your x402-protected Hono app

A wallet finds the receipt at extensions["offer-receipt"].info.receipt and the record at extensions["compliance-fields"].info.record of the decoded PAYMENT-RESPONSE (X-PAYMENT-RESPONSE on x402 v1). Sellers whose readers still parse the JSON body can pass legacyBodyPlacement: true for one more minor release.

The full register:

CapabilityIn the record
ReceiptsSeller-signed EIP-712 (x402 offer-receipt extension), keccak256 canonical digests
withAssure()x402 fetch-handler adapter — receipt + compliance-fields record in PAYMENT-RESPONSE on each paid call it can issue for, the paid response passed through unchanged when it cannot; compliance-fields advertised on 402
Compliance-fields recordsMINIMAL tier (Art 226b simplified-invoice content) via buildMinimalRecord · ledger exports format=art226b · format=s51c — mappings, not certifications
Action recordsActionRecordV1 — GDPR-minimized; states that an Art-50 disclosure was presented, with a digest of its text and never the text, signed by the deployer and counter-signed when it reaches the ledger; what it says is still the deployer's own report
RefundsA refund record carries refundOf, the digest of the record it corrects · record_refund logs a pending refund entry on the ledger (not counter-signed); it moves no money
Disputes v0Objective reason codes, signed evidence submission, deterministic triage: fixed rules classify a duplicate charge (R1 reads receipts from one seller to one payer that share one settlement transaction as one payment) or an unanswered claim and record the result as data, not an adjudication; anything else is marked escalated, for an external venue the parties choose
Venue envelopesInternet Court (5,000-char slot) · Kleros ERC-1497 · UMA · generic
Evidence packsformat=art50 · format=safr (beta)
IdempotencyIn-memory + Cloudflare D1 stores
tersign interceptAudit capture at the MCP boundary — a signed, digest-only action record per tool call (experimental)

Capture at the MCP Boundary — tersign intercept

An agent's tool calls are usually recorded, if at all, inside the agent's own code. Record them at the wire instead:

npx tersign intercept -- npx your-mcp-server

The proxy is a pure observer: bytes reach the server and the client exactly as sent, in order, unmodified. It runs on your side with your key, so each record is still your own report. Every tools/call that gets a response becomes an ActionRecordV1 signed by *your* key and, when a ledger is configured, counter-signed into a hash chain; a call cancelled or never answered leaves no record. Digests only: each record carries a digest of the call's arguments and one of its result or error (canonical JSON), never the content. Records go to a configured ledger, and fall back to a local ~/.tersign/intercepts- .jsonl, where they carry your signature only, so evidence is never silently dropped.

Experimental, and deliberately unopinionated about where the protocol lands: it implements the observation semantics of the audit-mode validator described in MCP SEP-2624 (Draft) as a transport-level proxy today, and is structured to move onto the interceptor primitive if and when that stabilizes. It makes no conformance claim to that draft.

For Agents — the MCP Server

npx tersign starts the MCP server (stdio). Official registry entry: io.github.tersignhq/evidence (active).

{

"mcpServers": { "tersign": { "command": "npx", "args": ["tersign"] } } }

No configuration is needed. With `TERSI

只显示了开头部分;其余内容请在仓库中阅读

问 PopNx