Talk with your agents · Last updated: 12 October 2026
voicehook.ai runs a remote MCP server at https://voicehook.ai/mcp. It lets your
Claude join a voicehook.ai voice call as the brain behind the voicebot: you speak, the voicebot
passes on what you said, and it speaks the answers your Claude sends. Talk with your agents.
https://voicehook.ai/mcp/plugin marketplace add voicehook-ai/voicehook-agent /plugin install voicehook-join@voicehook
From plugin 1.2.0 the plugin includes the MCP server, so there is nothing else to configure (current version 1.3.0). Source: github.com/voicehook-ai/voicehook-agent.
Then give your Claude the agent invite link from the call (plus button), for example
https://voicehook.ai/r/<room>?invite=.... The full agent instructions are at
voicehook.ai/agent/mcp/SKILL.md.
Cloud and sandboxed agent sessions (for example Claude Code on the web) often allow only HTTPS
through a proxy. WebRTC is blocked there, so the local voicehook-agent CLI cannot join
(wait_pc_connection timed out). Use this MCP server instead: the server joins the
call for you, and HTTPS is all your agent needs. Without an MCP client, plain curl works: a
JSON-RPC tools/call to POST https://voicehook.ai/mcp, the answer
arrives as one Server-Sent Events data: line.
curl -sS https://voicehook.ai/mcp -H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"join","arguments":{"invite_url":"<agent invite link>","label":"<your label>"}}}'
Pass the returned session to next, say and the other tools
the same way; "method":"tools/list" lists every tool with its parameters.
Your Claude can also start a call itself, without an invite link from you:
create_call and gets two links: human_url for you and operator_invite_url for itself.human_url link with a short note (share_text). Open it in your normal browser (Chrome, Safari, Firefox), not in an app's built-in browser, which blocks the microphone. The call starts.join with operator_invite_url. join waits up to 50 seconds for you to open the link and join, otherwise it returns waiting_for_human and your agent calls join again right away.next and answers with say.
Main agent only: create_call is made by the main agent of the session you are talking to, never by a subagent, fork or background job; otherwise the link stays in a subthread and never reaches you. Never delegate create_call to a subagent.
Link first: the agent ends its turn with share_text as its final line and puts nothing after it, because anything later may never reach you in a remote or phone app; agents that can keep working in the background may start the join in the background but still end that turn with the link, the others join once you say the link is open.
Until you are in the call, every message from your agent ends with that link, so it never scrolls away.
The agent that creates the call pays nothing. Whoever opens human_url pays from their
free minutes or their balance. A link nobody opens expires after 30 minutes and costs nothing.
Limits for create_call: 10 per hour per IP address, 60 per hour per egress network
(for example all claude.ai users together), 300 per hour overall.
create_callopen world
Starts a new call for your user. Never delegate create_call to a subagent, a fork or a background job: create the call in the main thread of the session your user is talking to and give share_text as the last message of that thread. Returns human_url for your user, share_text (the message to pass on verbatim: the link plus the hint to open it in a normal browser), operator_invite_url for join, room and expires_in (seconds until an unopened link expires). Whoever opens human_url starts the call and pays for it from their free minutes or balance, otherwise 402. A link nobody opens expires after 30 minutes (410).
Parameters: name, lang (de, en), mode (normal).
joinopen world
Joins an existing voicehook.ai call as the brain behind its voicebot. Returns session (the handle for all other tools), room, lang, idle_timeout_s, peers, instructions, context (call language, mode, instructions, the functions you can call, the multi-agent rules and the skill link; the source of truth for this call), humans_present (people in the call, without agents) and, unless quiet, a share line for your user. With humans_present 0 it also returns human_away: true and a message: the person is out right now, keep calling next and never create a new room. For a call from create_call, join waits up to 50 seconds until the person has opened the link and is in the call, otherwise it returns status waiting_for_human (not an error, with share_text again): call join again right away.
Parameters: invite_url (required, max 2048 characters), label (text on your chip, max 22 characters; longer is rejected), model (exact model id, internal), greet (default true: the voicebot greets for you in the call language), quiet (drops share and notice, nothing audible); name is the old name of label.
nextread-onlyopen world
Waits up to 50 seconds for the next event in the call: user (what the user said), revise, status_request, decision (the human answered your decide), operator (another agent addressed you), context (the call language changed), timeout, human_left / human_rejoined (the person dropped out and came back, also when you joined while they were out; keep calling next, never create a new room, greet them briefly when they are back unless greeted is true: then your join greeting was just spoken) or ended. User events and operators_said lines carry addressed_to and addressed_to_you. Every answer also has operators_said (what other agents said, with their names; never your own echo), agent_said (what the voicebot said on its own), board_now and activity_now (what the voicebot knows about you), humans_present and, when your board or activity feed is overdue or you sent no activity line 30 seconds after joining, stale_error with a message to follow. Call it again right after every say, and at least every 10 to 15 seconds while you work (split long work into steps). Run exactly one next loop per agent: a newer next makes a still waiting older one return superseded. After a pause, a user event carries missed (all user turns you missed, oldest first) and away_s.
Parameters: session (required), timeout (seconds, default 45, max 50).
sayopen world
The voicebot speaks the text verbatim. One complete, phone-ready thought per call; queued says can be appended, overwritten or revised. In live mode the voice phrases it itself: the result carries verbatim:false and mode:"live_paraphrase" (also on next), so keep it short and put details in show.
Parameters: session (required), text (required, max 4000 characters; no URLs, code, lists or emoji), mode (append default, overwrite, revise).
statusidempotentopen world
Replaces your status board, which is never spoken. The voicebot answers the user from it while you work.
Parameters: session (required), doing (current step and ETA, max 400 characters), open and done (max 10 items each, every item understandable on its own), faq (max 6 question and answer pairs), emoji (one from the list, shown on your chip; empty removes it). Questions that wait for the person go to decide, not into open.
showopen world
Puts a card on the user's call page, never spoken: text, code, a link or an explanatory image. Use it when something should be read or seen rather than heard. Can also open or close the status board, the activity log, the Decision Board or the cards view for the user.
Parameters: session (required), text (max 4000 characters; for code the code, for link one http(s) URL; use link for every link the user should open, http(s) URLs in a text card are clickable too), title (max 80 characters), kind (text default, code, link, image), image (SVG text up to 100 KB or base64 PNG/JPEG/WebP up to 1 MB), panel (board, log, cards, decisions, none).
activityopen world
Adds one line of 3 to 8 words to the activity feed: what you are doing right now. Call it on every step; the call page shows "<label> joined" as the first line when you join. Never commands, paths, file contents or secrets.
Parameters: session (required), text (required).
decideopen world
Puts a question that the human has to decide on the call's Decision Board, numbered in the call: by default a yes/no question, otherwise 2 to 3 options with your recommendation. The person can always answer freely by voice. Returns id and number; the answer arrives later as a next event of type decision (yes, no, option or other with text).
Parameters: session (required), question (max 160 characters, required when creating), options (2 to 3, max 40 characters each; leave out for yes/no), recommend (index), id and delete (change or remove an open decision).
leavedestructiveidempotentopen world
Leaves the call, optionally with a short goodbye. Only when the user says goodbye; the session handle is invalid afterwards.
Parameters: session (required), say.
operators_said in every next event; answer only when you are addressed (addressed_to_you) or clearly meant, address other agents by their label.context.lang), briefly, and show your work on the board.Full rules: voicehook.ai/agent/MULTI-AGENT.md. The same rules arrive in join as context.rules.
No call content is logged; our server logs only metadata such as the room name, participant identifier and IP address. The invite link acts as the access key: anyone who has it can join, so only give it to agents you trust. The session handle is short-lived and becomes invalid when you leave.
Details: Privacy Policy.
About 10 minutes free every day (about 3 minutes in live mode). Prepaid credit from 10 EUR, no subscription.
For calls started with create_call, the person who opens the link pays from their free minutes or balance.
403 on join: the invite is missing or invalid. Use the agent link from the call (plus button), including ?invite=.404: the session expired or you left. 410: the call has ended. Do not rejoin with the old handle.429: too many joins. Wait a minute or ask for a fresh link.409 on join (no human in room): the room is empty. Tell your user in the chat, call join again every 15 seconds for at most 2 minutes, then tell your user nobody is in the call and stop. Never create a new room. If the person is only out for a moment, join succeeds with humans_present 0 and human_away: keep calling next.402 on opening a create_call link: the person opening it has no free minutes and no balance left.waiting_for_human on join after a create_call (not an error): join waited 50 seconds and nobody opened the link yet, or the person left for a moment. Call join again right away; the call stays open for a while so the person can come back with the same link.503 or another 5xx answer, or a network error: voicehook is restarting (a deploy takes about 2 seconds). Call the same tool again after 2 seconds; the session and the call stay valid.410 after a create_call: the link expired after 30 minutes unopened. Call create_call again.next times out after about 45 seconds by default. Just call next again.