MCP Tools
Live: https://dev.mcp.ivalt.com/mcp (http://dev.mcp.ivalt.com → https). Health: https://dev.mcp.ivalt.com/health.
The iVALT MCP server exposes the following tools. All responses are wrapped as MCP text content with pretty-printed JSON.
Shared input fields
request_approval and request_approval_async share these input fields. check_status uses its own.
| Field | Type | Required | Description |
|---|---|---|---|
action |
string | yes | Human-readable description of the sensitive action. |
reason |
string | no | Optional extra context shown alongside the action. |
approver_mobile |
string | no | E.164 phone (e.g. +12025550123). Overrides IVALT_DEFAULT_MOBILE. |
factors |
string[] | no | Verification factors: biometric, location, time, device. Defaults to IVALT_DEFAULT_FACTORS. |
request_approval
Sends an iVALT push, waits for the approver to respond, and returns a PKI-signed attestation. This call blocks until approval, denial, or timeout.
Input
{
"action": "Approve production deploy",
"reason": "Urgent hotfix",
"approver_mobile": "+12025550123",
"factors": ["biometric", "location"],
"timeout_s": 60
}
Output
approved— returnsattestationdenied— returnsdetailexpired— returnsdetail
{
"status": "approved",
"attestation": { ... }
}
request_approval_async
Fires the approval and returns a request_id immediately. Use check_status to poll the result.
Input
{
"action": "Approve database migration",
"approver_mobile": "+12025550123",
"factors": ["biometric"]
}
Output
{
"status": "pending",
"request_id": "eyJtIjoi...",
"approver_mobile": "+12025550123",
"expires_at": "2026-08-27T12:00:00.000Z"
}
check_status
Polls a request_id returned by request_approval_async.
Input
{
"request_id": "eyJtIjoi..."
}
Output
pendingapproved— includesattestationdenied— includesdetailexpired— includesdetail
{
"status": "approved",
"request_id": "eyJtIjoi...",
"attestation": { ... }
}
Response wrapper
Every tool result is returned to the MCP client as:
{
"content": [{ "type": "text", "text": "<pretty-printed JSON>" }],
"isError": false
}
When isError is true, the payload contains status: 'error' and a detail string.