v0.1.3 — Open Protocol · MIT License

Every bot has a
soul behind it.
Prove yours.

Soulprint gives any AI agent a 100-point trust score: ZK-verified human identity (0–80) + behavioral reputation across the ecosystem (0–20). No servers. No PII. No central authority.

⭐ Star on GitHub 📦 npm install 📖 How it works
$ npx soulprint verify-me --selfie me.jpg --document cedula.jpg
# ✅ ZK proof generated in 564ms
# 🌀 Token issued: did:key:z6Mk... | score: 90/100
# 🔒 Zero PII leaves your device
7
npm packages
7
countries supported
104+
tests passing
100
max trust score
0
PII stored
MIT
license
The Problem

AI agents are anonymous by default

Agents book flights, submit job applications, call financial APIs. But services have no way to know if there's a real human behind the request — or a bot farm.

?

No identity layer

MCP and agent frameworks have no native identity. Any bot can call any service as if it were human.

?

No behavioral history

A spammer and a legitimate user are identical. Services can't warn each other about bad actors.

?

No premium trust gating

High-trust actions (job applications, financial queries) require human verification that doesn't exist.

Soulprint solves all three

ZK identity + behavioral reputation + verified service attestations = complete trust layer.

From zero to trusted in 4 steps

Everything happens locally. Your biometrics never leave your device.

1

📷 Scan your ID + selfie

Tesseract OCR reads the document. ICAO 9303 check digits validate the MRZ. InsightFace matches your face to the document photo.

2

🔐 ZK proof generated locally

Circom circuit (844 constraints, Groth16) generates a proof. Private inputs: ID number, DOB, face embedding, salt. Public output: nullifier — mathematically derived, no way to reverse.

3

🌀 SPT token issued

An Ed25519-signed Soulprint Token (SPT, ~700 bytes) encodes your DID, credential scores, bot reputation, and ZK proof. Valid 24h, auto-renews. Works offline.

4

🏆 Access unlocked

Pass the token to any Soulprint-integrated service. Score ≥ 60 unlocks KYC features. Score ≥ 95 unlocks premium endpoints requiring verified identity + clean behavioral record.

Trust Score

A 100-point score that means something

Two independent components that compound into a complete trust picture.

0–80
Identity Score
ZK-verified credentials
+
0–20
Bot Reputation
Behavioral attestations
=
0–100
Trust Score
Complete picture

Identity credentials (max 80 pts)

CredentialPointsHowStatus
📧 EmailVerified+8Email confirmation linkAvailable
📱 PhoneVerified+12SMS OTPAvailable
🐙 GitHubLinked+16OAuthAvailable
🪪 DocumentVerified+20OCR + MRZ check digits (ICAO 9303)Available
🤳 FaceMatch+16InsightFace biometric matchAvailable
🔒 BiometricBound+8Device bindingAvailable

Bot reputation (max 20 pts)

Starts at 10 (neutral). Verified services issue +1 or -1 attestations. Propagates P2P across all nodes.

0–9
Penalized
Spam or abuse history
10
Neutral
New bot, no history
11–15
Established
Verified activity across services
16–20
Trusted
Excellent track record

Access levels

ScoreIdentityAccessExample
0–17AnonymousBasic read-onlySearch products, view listings
18–35Email/PhoneStandard toolsHotel search, financial comparators
36–59Partial KYCMost featuresDetailed financial queries
60–94KYCFullAdvanced featuresService integrations, gated tools
95–100KYCFull + reputationPremium endpointstrabajo_aplicar — verified job application

mcp-colombia-hub — the first verified service

The first MCP server to integrate Soulprint. Every tool call is tracked. Spam gets -1 rep. Normal usage earns +1. Premium job applications require score ≥ 95.

🛒 Available tools

  • 🛍️ ml_buscar_productos — MercadoLibre search
  • 📦 ml_detalle_producto — product details
  • ✈️ viajes_buscar_vuelos — flight search
  • 🏨 viajes_buscar_hotel — hotel search
  • 💰 finanzas_comparar_cdt — CDT comparison
  • 🏦 finanzas_simular_credito — credit simulator
  • 💳 finanzas_comparar_cuentas — savings comparison
  • 🏠 inmuebles_buscar — real estate listings
  • 📊 soulprint_status — view your trust score
  • 🌟 trabajo_aplicarrequires score ≥ 95

🛡️ Automatic reputation signals

  • 🔴 Spam detected → -1 rep
    >5 requests in 60 seconds
  • 🟢 Normal usage → +1 rep
    3+ tools, 3+ completions, no spam
  • Attestations signed by mcp-colombia DID
  • 🌐 Gossips P2P to all known validator nodes
  • 🔐 Ed25519 signed — tamper-proof, verifiable offline
Install
npx -y mcp-colombia-hub

The premium endpoint — trabajo_aplicar

// Bot with score 94: BLOCKED
{ "error": "Score insuficiente: 94 < 95 requerido" }

// Bot with score 97: APPROVED ✅
{
  "application_id": "SP-M9X3K2-Z6MK4F",
  "applicant": {
    "did":       "did:key:z6Mk...",   // unique — no PII
    "score":     97,
    "verified":  true
  },
  "trust_guarantees": {
    "human_verified":  true,   // Groth16 ZK proof
    "no_spam_history": true,   // bot_rep ≥ 8
    "zkp":             true    // proof included
  }
}
npm Packages

7 packages, one protocol

All MIT licensed. Install only what you need. No vendorlock.

soulprint
CLI — verify yourself, run a node, manage your identity
npx soulprint verify-me
soulprint-core
DID generation, Ed25519 tokens, attestations, score computation
npm i soulprint-core
soulprint-verify
OCR + InsightFace biometric match. On-demand subprocess, zero residual memory
npm i soulprint-verify
soulprint-zkp
Circom 2.1.8 circuits + snarkjs Groth16. 844 constraints, 564ms prove, 25ms verify
npm i soulprint-zkp
soulprint-network
Validator node with P2P gossip, rate limiting, anti-Sybil, reputation persistence
npx soulprint node
soulprint-mcp
MCP middleware — 3 lines to add identity gating to any MCP server
npm i soulprint-mcp
soulprint-express
Express/Fastify middleware — req.soulprint.score, req.soulprint.did
npm i soulprint-express

Quick integration — any MCP server

import { soulprint } from 'soulprint-mcp';

const server = new McpServer({ name: 'my-service', version: '1.0' });
server.use(soulprint({ minScore: 60 }));  // require KYCFull or better

server.tool('premium-action', ..., async (args, ctx) => {
  // ctx._soulprint.did   → verified human identity
  // ctx._soulprint.score → 0-100
  // ctx._soulprint.bot_rep → 0-20 reputation
});

7 countries — one PR each

The protocol is country-agnostic. Each country is one TypeScript file. Contribute yours and your whole country benefits.

🇨🇴
Colombia
Full Cédula + MRZ + face
🇲🇽
Mexico
Partial INE / CURP
🇦🇷
Argentina
Partial DNI
🇻🇪
Venezuela
Partial Cédula V/E
🇵🇪
Peru
Partial DNI 8 digits
🇧🇷
Brazil
Partial CPF mod-11
🇨🇱
Chile
Partial RUN mod-11
🌍
Your country?
Open a PR →

Add a country in ~30 lines

// packages/verify-local/src/document/countries/ES.ts
import { CountryVerifier } from '../verifier.interface.js';

const ES: CountryVerifier = {
  countryCode:   'ES',
  countryName:   'Spain',
  documentTypes: ['dni', 'nie'],
  parse(ocrText: string) { /* extract fields */ },
  validate(docNumber: string) { /* mod-23 check digit */ },
};

export default ES;
Comparison

How Soulprint compares

We're not replacing KYC providers. We're building the open alternative for AI-native use cases.

FeatureSoulprintWorldcoinStripe IdentityPersona
Open source ✅ MIT
Bot reputation layer ✅ P2P attestations
MCP/agent native ✅ soulprint-mcp
No PII stored
Works offline
ZK proofs✅ Groth16
No monthly fee✅ free❌ per-check❌ per-check
Multi-country documents✅ 7+ countries🟡 iris only
Self-hosted node
npm installable✅ 7 packages

Common questions

Does Soulprint store my ID or face anywhere?
Never. Everything happens locally on your device. The Circom circuit generates a ZK proof from your ID and face, then the raw data is discarded. The only thing that leaves your device is the ~700-byte signed token — which contains a nullifier (a one-way hash) and your score. No name, no ID number, no biometric.
Can I verify twice with the same ID and get two identities?
No. The nullifier is deterministically derived from your ID + biometrics. The same person will always produce the same nullifier — even on different devices. This makes Sybil attacks impossible: each human gets exactly one nullifier, and the network tracks nullifier registrations to prevent multiple DIDs from the same person.
What is an "attestation" and who can issue them?
An attestation is an Ed25519-signed statement from a verified service: "this bot behaved well (+1) or poorly (-1)." Only services with Soulprint score ≥ 60 can issue attestations — this prevents low-quality or malicious services from gaming the reputation system. The signature is cryptographically bound to the service's DID, so you can't forge an attestation from a service you don't control.
How do I run a validator node?
Run: npx soulprint node --port 4888. The node exposes a REST API for attestation submission, reputation queries, and peer registration. It persists reputation and peers to ~/.soulprint/node/. When it receives a valid attestation, it gossips it to all known peers (fire-and-forget, 3s timeout). Eventually all nodes in the network converge.
Can I use Soulprint without buying a domain or hosting?
Yes — everything runs locally. The CLI, ZK prover, OCR, and face match all work offline. The only network requirement is reaching a validator node to register your nullifier the first time. You can even run your own local node (npx soulprint node) for development.
What's the roadmap?
Phase 5: Full P2P network with libp2p (DHT gossip, multi-node consensus) — each OpenClaw instance becomes a validator. Phase 6: More countries (Spain, Germany, India, Nigeria, South Africa, Philippines). Future: Mobile SDK, browser extension for web agent identity, DAO-based attestation voting.

Build the trusted AI ecosystem

Every service that integrates Soulprint makes the ecosystem more valuable. Every PR adds a country. Every star tells developers this matters.

⭐ Star on GitHub 📦 npm packages 🌍 Add your country 📝 Dev.to articles