{"openapi": "3.0.3", "info": {"title": "iVALT MCP Server", "version": "1.0.0", "description": "MCP server for iVALT human-in-the-loop biometric approval. Exposes a JSON-RPC 2.0 Streamable-HTTP endpoint at /mcp and a /health probe.", "contact": {"name": "iVALT", "url": "https://www.ivalt.com"}}, "servers": [{"url": "https://dev.mcp.ivalt.com", "description": "Production (Nginx + TLS)"}, {"url": "http://localhost:8080", "description": "Local Docker Compose"}], "security": [{"bearerAuth": []}], "paths": {"/health": {"get": {"summary": "Health probe", "operationId": "health", "security": [], "responses": {"200": {"description": "Server is healthy", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HealthResponse"}}}}}}}, "/mcp": {"post": {"summary": "MCP JSON-RPC 2.0 endpoint", "operationId": "mcpPost", "description": "Streamable-HTTP transport for MCP. Accepts JSON-RPC 2.0 requests such as initialize, tools/list, and tools/call.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JSONRPCRequest"}}}}, "responses": {"200": {"description": "JSON-RPC response or stream", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JSONRPCResponse"}}}}, "401": {"description": "Unauthorized", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JSONRPCError"}}}}}}}}, "components": {"securitySchemes": {"bearerAuth": {"type": "http", "scheme": "bearer"}}, "schemas": {"HealthResponse": {"type": "object", "required": ["ok", "transport"], "properties": {"ok": {"type": "boolean", "example": true}, "transport": {"type": "string", "example": "http"}}}, "JSONRPCRequest": {"type": "object", "required": ["jsonrpc", "method", "id"], "properties": {"jsonrpc": {"type": "string", "example": "2.0"}, "method": {"type": "string", "example": "tools/call", "enum": ["initialize", "tools/list", "tools/call"]}, "id": {"type": "string"}, "params": {"type": "object"}}}, "JSONRPCResponse": {"type": "object", "required": ["jsonrpc", "id"], "properties": {"jsonrpc": {"type": "string", "example": "2.0"}, "id": {"type": "string"}, "result": {"type": "object"}, "error": {"$ref": "#/components/schemas/JSONRPCError"}}}, "JSONRPCError": {"type": "object", "required": ["code", "message"], "properties": {"code": {"type": "integer"}, "message": {"type": "string"}}}, "RequestApprovalInput": {"type": "object", "required": ["action"], "properties": {"action": {"type": "string", "description": "Human-readable description of the sensitive action."}, "reason": {"type": "string", "description": "Optional extra context."}, "approver_mobile": {"type": "string", "description": "E.164 phone number. Overrides IVALT_DEFAULT_MOBILE."}, "factors": {"type": "array", "items": {"enum": ["biometric", "location", "time", "device"]}, "description": "Verification factors to require."}, "timeout_s": {"type": "integer", "minimum": 1, "description": "How long to wait, in seconds."}}}, "RequestApprovalAsyncInput": {"type": "object", "required": ["action"], "properties": {"action": {"type": "string"}, "reason": {"type": "string"}, "approver_mobile": {"type": "string"}, "factors": {"type": "array", "items": {"enum": ["biometric", "location", "time", "device"]}}}}, "CheckStatusInput": {"type": "object", "required": ["request_id"], "properties": {"request_id": {"type": "string", "description": "Opaque request_id from request_approval_async."}}}, "ApprovalOutput": {"type": "object", "properties": {"status": {"type": "string", "example": "approved"}, "attestation": {"type": "object"}}}, "PendingOutput": {"type": "object", "properties": {"status": {"type": "string", "example": "pending"}, "request_id": {"type": "string"}, "approver_mobile": {"type": "string"}, "expires_at": {"type": "string", "format": "date-time"}}}, "StatusOutput": {"type": "object", "properties": {"status": {"type": "string", "enum": ["pending", "approved", "denied", "expired"]}, "request_id": {"type": "string"}, "attestation": {"type": "object"}, "detail": {"type": "string"}}}}}}