> ## Documentation Index
> Fetch the complete documentation index at: https://docs.opengeni.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Approvals & questions

> Require a human to approve tool calls, and let the agent ask structured questions.

A session can pause mid-turn and wait for a person in two ways. `SessionConversation` renders both inline, and the same turn continues once someone answers. See [Approvals and human input](/concepts/approvals-and-human-input) for the full model.

## Require approval for tools

Set `requireApproval` on a per-session MCP server: `true` for every tool, or a list of tool names:

```ts theme={null}
mcpServers: [
  {
    id: "acme",
    url: "https://api.acme.com/mcp",
    headers: { Authorization: `Bearer ${token}` },
    requireApproval: ["update_ticket", "refund_order"], // reads run freely; writes wait
  },
],
tools: [{ kind: "mcp", id: "acme" }],
```

When the agent proposes a gated call, the session enters `requires_action` and the conversation shows the call with Approve and Reject. A rejection goes back to the agent as the tool's result so it can adapt. Approvals are human-only: an agent can never approve a tool call.

## Let the agent ask questions

Agents have a built-in tool for questions that need an answer before the turn can continue: free text, single select, or multi select, up to 20 per request. Answers are delivered to the agent as the tool's output. To turn it off, set the workspace setting `agentHumanInputEnabled: false`.

## Answering without the React UI

| Surface | Approve or reject | Answer a question |
| - | - | - |
| SDK | `sendApprovalDecision` | `listHumanInputRequests`, then `submitHumanInputResponse` |
| Chat facade | `chat.respond(...)` | `chat.respond(...)` |

Custom React UIs can use `projectPendingApprovals` and `useHumanInputRequests` from `@opengeni/react/session`.

If a user sends an ordinary message while a session waits, the pending approval or question is cancelled and the message is delivered as a Steer. "Actually, do this instead" is one action.

To notify people who are not watching, subscribe a [workspace webhook](/integrate/host-managed-integrations#webhooks) to `session.requiresAction` and `session.humanInput.requested`.

<Tip>Using a coding agent? The [opengeni-client skill](/reference/for-ai-agents) covers this.</Tip>
