Three steps to a verified answer.
- 01 · Install
pip install fayda-mcp - 02 · Configure
fayda-mcp check-config --env-file .env - 03 · Verify
fayda-mcp run --env-file .env
- →start_verification(purpose="kyc", checks=["identity_verified", "age_over_18"], …)
- ←request_id "vr_8c21f0" · authorization_url eSignet consent link
- ·The citizen signs in and consents on eSignet, outside the agent conversation.
- →get_verification_status("vr_8c21f0") → "verified"
- →get_verification_result("vr_8c21f0")
{ "request_id": "vr_8c21f0", "status": "verified", "checks": { "identity_verified": true, "age_over_18": true }, "reasons": {} }
Verification as tools. Results as booleans.
11 MCP tools
Start, check, fetch and cancel verifications from any MCP client.
eSignet OIDC
Citizens sign in with Fayda. PKCE and private_key_jwt built in.
Privacy-first results
Agents get booleans like age_over_18, never names or birth dates.
Offline QR
Checks a card's signature with no network. It can't prove the holder is present.
Details matching
Confirm what a customer told you, field by field, without seeing the values.
Your stack
Headless Python core with optional FastAPI, Redis and PostgreSQL extras.
A few lines of Python.
# Core: MCP tools, eSignet OIDC, offline QR
pip install fayda-mcp
# Optional FastAPI, Redis and PostgreSQL adapters
pip install "fayda-mcp[fastapi,redis,postgres]"
from fayda_mcp import FaydaConfig, FaydaVerificationService
from fayda_mcp.mcp.factory import create_mcp_server
from fayda_mcp.storage.memory import MemoryResultRepository, MemorySessionStore
service = FaydaVerificationService(
config=FaydaConfig.from_env(), # FAYDA_* variables
sessions=MemorySessionStore(),
results=MemoryResultRepository(),
)
server = create_mcp_server(service=service)
if __name__ == "__main__":
server.run(transport="stdio")
result = await service.submit_qr_verification(
qr_text="<raw_scanner_text>",
purpose="kyc",
checks=["credential_signature_valid", "age_over_18"],
)
result.checks # {'credential_signature_valid': True, 'age_over_18': True}
result.holder_authenticated # False: a scan can't prove the holder is present
{
"mcpServers": {
"fayda": {
"command": "fayda-mcp",
"args": ["run", "--transport", "stdio", "--env-file", "/path/to/.env"]
}
}
}
Private by design.
Minimal predicates
true, false or unavailable. Nothing more.
Data filtering
Schemas reject extra fields. Stored details use AES-256-GCM.
Cryptographic checks
PKCE S256, RFC 7523 assertions, JWKS and RS256 signatures.
Caller isolation
Each tenant and principal sees only its own records.
Independent open-source project. Not an official Fayda product or a compliance certification. Production guide