Aval

GuidesAI agents and human approval

Adding human approval to an MCP agent

Give Claude, ChatGPT or Cursor an ask_human tool: the agent asks for your approval on your phone before acting, and waits.

· by Antoine

The MCP protocol lets you give tools to an agent. One of the most useful does nothing technical at all: it asks a human a question and waits for the answer.

Why go through MCP

MCP, short for Model Context Protocol, is the standard plug that connects an AI agent to tools. Claude, ChatGPT, Le Chat, Grok, Claude Code, Cursor and VS Code can all use it. An MCP server declares its tools, with their names and parameters, and the agent decides on its own when to call them.

For human approval, that's handy: instead of coding a pause into every agent, you give it an ask_human tool. It calls it when it reaches a decision that isn't its to make, just as it would call a search tool.

What the tool looks like

In Aval, the tool is called ask_human and takes these parameters:

  • question: the question, short and understandable on its own (300 characters at most);
  • options: two to six possible answers, which become buttons. “Yes” and “No” by default;
  • context: what you need to know to decide, in plain text: amount, recipient, draft, link;
  • agent_name: who is asking, for example “Claude Code · billing”;
  • expires_in_minutes: how long before the question expires, one hour by default and up to seven days.

A call looks like this:

ask_human(
  question: "Pay the OVH invoice of €42.90?",
  options: ["Pay", "Wait", "Refuse"],
  context: "Due tomorrow. Same amount as last month.",
  agent_name: "Claude Code · billing"
)

The question goes straight to your phone, on Telegram or by email, with one button per option. The call waits up to 45 seconds for the answer. If you haven't answered yet, it returns the status pending and an ID; the agent then calls wait_for_answer with that ID, as many times as needed. In the end it gets one of three outcomes: answered with the chosen option (and a comment if you wrote one), expired if the deadline has passed, or cancelled.

Connecting it

The server URL is https://www.taraxe.com/aval/mcp. There's no key to copy: on the first call, the agent has you sign in with your email, and the account is created with 20 free questions.

  • Claude: Customize, then Connectors, then “Add custom connector”, and paste the URL.
  • ChatGPT: in plugins, add an MCP server (developer mode must be turned on in the advanced settings).
  • Claude Code: claude mcp add --transport http aval https://www.taraxe.com/aval/mcp, then /mcp to sign in.
  • Cursor and VS Code: a button on the Aval page adds the server in one click.

Telling the agent when to ask

Connecting the tool isn't quite enough. The agent sees it and reads its description, but it's better to tell it plainly where the line is. Paste an instruction like this into its instructions:

Before paying, sending a message on my behalf or deleting anything, ask me with the ask_human tool. If I don't answer, don't do it.

Adapt it to your use. An agent that manages your inbox doesn't have the same limits as one that works on a database.

Writing good questions

  • One decision per question. “Should I pay and send the receipt to the accountant?” mixes two things.
  • A question that makes sense on its own. You read it on the lock screen, without the agent's conversation: “Pay the OVH invoice of €42.90?” rather than “Should I continue?”.
  • The most likely option first: it's the one you tap fastest.
  • Options that say what will happen: “Pay” rather than “Yes”.
  • An option to put things off when it makes sense: “Wait”, “Tomorrow”.
  • In the context, whatever you would go and check yourself: the amount, the name, the first lines of the email.

What about security?

The agent asks the question, but it can't answer it. The answer link is a secret that only goes through your email or your phone, and the access the agent gets only lets it ask questions and read the answers. An expired question never counts as approval: the response explicitly tells the agent not to act.

Frequently asked questions

Does the agent wait for my answer forever?

Each call waits 45 seconds at most, then the agent calls wait_for_answer again. The question itself lives until its deadline, one hour by default and up to seven days. Waiting costs nothing.

Can I answer something other than the buttons?

Yes. On top of picking an option, you can write a note to the agent, for example “pay it, but with the business card”. It gets it along with your answer.

Does it work without MCP?

Yes, through the API: an HTTP request with a key, from a script, n8n or Make. The guide n8n: approve a step from your phone shows how.