Check an AI agent before you do work for it

Anyone can start an agent, so its word for itself is worth little. Sigvara tells you whether an agent has a record of real payments and a bond it would lose if caught cheating. You ask in one call, with no account and no API key.

Testnet only. Sigvara runs on Arc testnet, and the bond is a valueless test token. The contracts have not had an independent audit, and there is no mainnet deployment. Almost every agent here today is Sigvara's own simulation or test, and nobody outside the team gates on a score yet, so treat scores as a preview rather than as evidence.

Try it

Reading…

From a service

This needs only ethers. It reads the chain, so there is nothing to sign up for.

import { Contract, JsonRpcProvider } from "ethers";

const abi = ["function isTrusted(address,uint8,uint256) view returns (bool)"];
const provider = new JsonRpcProvider("https://rpc.testnet.arc.io");
const reader = new Contract("0x2921b4eE879CdF5793FA273BbDc4E7dF01ABcef8", abi, provider);

// Active, a score of at least 40, and a bond of at least 1,000 test SVR.
if (!(await reader.isTrusted(agent, 40, 1000n * 10n ** 18n))) throw new Error("not in good standing");

isTrusted is true when the agent is Active, its bond meets both the protocol's current minimum and yours, and its score is at least yours. An address that never registered is false, whatever you ask for.

It tells you about an address. It does not tell you that your caller controls that address, so use it where you already know the address. If a caller only claims to be the agent, use the gate below.

From a contract

Here msg.sender is the proof, so there is nothing else to check.

interface ISigvaraReader {
    function isTrusted(address agent, uint8 minScore, uint256 minBond)
        external view returns (bool);
}
ISigvaraReader constant SIGVARA =
    ISigvaraReader(0x2921b4eE879CdF5793FA273BbDc4E7dF01ABcef8);

// Then, in any function:
require(SIGVARA.isTrusted(msg.sender, 40, 1000e18), "not in good standing");

When a caller has to prove it is the agent

SigvaraGate in the SDK issues a challenge, checks the signature against the key on chain, then checks standing, and tells you why it refused.

import { SigvaraGate } from "@sigvara/protocol-sdk";

const gate = new SigvaraGate({
  rpcUrl: "https://rpc.testnet.arc.io",
  chainId: 5042002,
  addresses: {
    identity: "0x7e3aFC532eE5d922ab3cc3FFb510c7C8151477Dd",
    reputation: "0x6603C96275e85F724Cdf74666b399365e4cA29ed",
    staking: "0xA69d62B2a6774D21A2c15d5d83b27277eD31d35B",
  },
  threshold: 40,
  audience: "https://your-service.example",
});

// Hand this to the agent, which signs challenge.payload and returns the signature.
const challenge = gate.challenge(agentDid);

const result = await gate.admit(agentDid, challenge, signature);
// bad_proof, replayed, not_active, stale_score or below_threshold
if (!result.ok) refuse(result.reason);

The gate checks the protocol's minimum bond and does not take a larger one yet. Before running one for real, read what the SDK still needs from you.

For an MCP tool, the 10-minute gate is a complete server. For an agent's own lookups, npx -p @sigvara/protocol-sdk sigvara-mcp serves read-only trust tools.

Not here yet

Going further

To see an agent pass, register one on testnet. The integration guide covers the full standing struct, stale scores and what can change an answer.

We would like to work closely with the first few integrators, such as an MCP host, an x402 merchant or an agent marketplace. Open an issue or message @SigvaraProtocol.