MCP server
https://api.sidaxis.com/functions/v1/mcp
In production: Streamable HTTP, OAuth 2.1 with dynamic client registration, and nine tools that each map one-to-one onto an endpoint documented here.
| Endpoint | https://api.sidaxis.com/functions/v1/mcp |
| Transport | MCP Streamable HTTP |
| Authorisation | OAuth 2.1 with dynamic client registration |
The client registers itself, the person signs in and approves it on a consent screen, and every tool then acts as that user — so a tool can never read or move more than the person herself can. There is no API key on this path and no token to paste.
Connect
{ "mcpServers": { "sidaxis": { "url": "https://api.sidaxis.com/functions/v1/mcp" } } }The first call triggers registration and the consent screen; after approval the tools answer. A single POST with Accept: application/json, text/event-stream carries the whole transport, and a request without a valid OAuth token answers 401 Unauthorized — that is the expected unauthenticated response, not a fault.
The nine tools
| Tool | Endpoint | What it does |
|---|---|---|
mandate_scopes | mandate-scopes | The eight canonical scopes with human labels. Public, cacheable, no subject data. |
mandate_check | mandate-check | Advisory. Would this action fit inside the mandate? Nothing is locked, reserved or debited, and under concurrency it can return a false positive. Never treat it as permission to act. |
mandate_consume | mandate-consume | Authoritative. The only call that moves the ceiling, under SELECT … FOR UPDATE, and it requires idempotency_key. Without it a network timeout becomes a double charge. |
mandate_get | mandate-get | Read one mandate with its human statement, or list by effective status. |
mandate_revoke | mandate-revoke | Immediate and terminal. It needs no cooperation from the agent being revoked. |
mandate_issue | mandate-issue | Issue a mandate. It requires a capture_id from a live capture on a human surface within the last five minutes, so an agent can never mint its own authority. |
receipt_verify | rpc/get_receipt_v2 | Public verification of a receipt, no key required. An unknown hash returns null, never a 404, so nobody can probe for existence. |
identity_verification_request | agent-verification-request | One Face: mint a single-use card the person opens on her own device to prove she is present. Default 300 s, maximum 900 s. |
identity_verification_result | agent-verification-result | One Face: read the outcome — pending, opened, verified, refused or expired. Polling, not webhooks. |
Refusals are not errors
A refused action comes back as a successful call with allowed: false and three message layers: reason (machine-stable, never translated), developer_message (English, for logs) and user_message (localised). Branch on allowed, never on a status code. See errors.
One Face for agents
The pair that makes this server useful to a consumer-facing agent: the agent asks for a verification and gets a single-use link; the person opens it on her own device and proves she is present; the agent polls for the result. The agent never touches a camera or a microphone. See One Face agent card.
What is deliberately absent, and why
Enrollment and face recognition are not tools. A proof of a living person is a 128-float descriptor produced on that person's own device, by her camera and microphone, at that instant. A tool call is text executed on a server with neither. Listing “capture a face” would imply a machine can enrol or recognise a human — the exact fraud this product exists to prevent.
So the shape is always the same: the agent asks, the person proves. The agent operates inside what she already authorised, and when the ceiling is exceeded or a document is missing, the engine sends her back to the screen.
Theme and alias lookup stay out too: they are surface concerns, not agent concerns. Attribute disclosure waits until the consent step has an agent-facing shape.