MCP human approval for AI agent actions

Hold an agent's sensitive tool call until a person allows it. The approver answers in the agent's own chat, in Claude Code, ChatGPT and other MCP clients, with an optional one-time passcode (OTP) from their email, or in the Meandr console. Every decision is logged with their name.

Meandr is a gateway and cloud workspace for MCP servers and AI agents. Your agents connect to one workspace URL, and every tool call they make passes the workspace's policies: it is allowed, denied, or held for a person. Holding a call is human-in-the-loop approval. Meandr asks through MCP elicitation, the standard way an MCP server requests input, so the approval prompt appears inside the agent's own app. Here is how to set it up for one action, a Stripe refund over $300.

1

Add an Approve policy for the action

In Policies, add a policy for the call that needs a person's yes, set its action to Approve and seat the people who may decide. Stripe's MCP server writes through one tool, stripe_api_write, so an arguments matcher narrows the policy to the risky case: refunds over $300, which Stripe counts in cents.

The one-time passcode (OTP) is optional. Require an OTP is off by default. Without it, the prompt asks only for a decision and a comment, and an approval given in the chat carries no name. Switch it on when you need to know who said yes.

Every approval setting explained

2

Meandr holds the call and emails each approver

When the agent calls the tool, the call waits and every approver seated on the policy gets an email. With Require an OTP on, each email carries that approver's own code. It has eight letters and digits, works once and stops working when the deadline passes.

Review request opens the call in the console, for approvers who would rather decide there.

Turn approval emails on or off

3

The approver answers in the agent's chat

The agent's app shows Meandr's approval prompt: what is waiting, a link to approve it in the console instead, an optional comment and, when the policy requires it, the one-time passcode (OTP). Accept, and the call runs and the agent carries on with the result. It looks like this in Claude Code and in ChatGPT.

The first valid code decides. The other approvers' codes stop working. A wrong code ends the request, and the agent has to call the tool again. The comment is saved with the decision.

4

Or decide in the console, on the Tasks page

Every held call is also listed under Tasks, in Actions requiring approval. View shows what would run: the agent, the server, the tool, the policy that held it and the request itself. Allow releases the call, Deny rejects it, and a request nobody answers lapses at its deadline.

Approvers seated on the policy can decide here, and their sign-in names them. The console works in any browser, so a decision can come from a phone too.

Who can approve

5

Every decision lands in the log

The call's record keeps the policy that held it, the decision, the approver's name when the code or the console names them, and the comment. Denied and expired requests are recorded too, so "we stopped this" is always on the record.

What the audit record keeps

Questions about MCP human approval

What is human-in-the-loop approval for AI agents?
A rule that stops an agent's action before it runs and waits for a person to allow or deny it. In Meandr it is an Approve policy: the agent keeps working on everything else, and only the calls the policy matches wait for a decision.
Is the one-time passcode (OTP) required?
No. Require an OTP is a per-policy switch and is off by default. Turn it on when the approval has to carry a name, for payments, deletions or anything an auditor will ask about.
Which AI agents show the approval prompt?
Agents whose app supports MCP elicitation, such as Claude Code and ChatGPT, show it in their chat. With any other agent the request switches to Offline approval, and approvers decide on the Tasks page in the console.
What happens if nobody approves before the deadline?
Meandr cancels the request when the policy's deadline passes, and the action never runs. The expired request stays in the log.
Which actions are worth holding for approval?
Anything costly or hard to undo: refunds and payments over a limit, deleting data, merging to a protected branch, messages to customers, sharing private files. Everyday reads and small changes keep running without a person.

Next steps

Write your first policy

Allow a call, deny it, or ask a person first, by agent, server, tool or argument.

Read the guide

Stripe refunds with approval

The full setup behind this example, from connecting Stripe to the $300 threshold.

See the case

Hold your agents' risky actions for a person

Add an Approve policy, seat the people who decide, and switch on the one-time passcode (OTP) when the approval needs a name.

Try for free

Questions? Email us