← ∆ voicehook.ai

MCP connector

Talk with your agents · Last updated: 12 October 2026

What it is

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.

Setup

claude.ai and Claude Desktop

  • Open Settings, then Connectors, then Add custom connector.
  • URL: https://voicehook.ai/mcp
  • No authentication.

Claude Code

/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.

From cloud or sandboxed sessions

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 agent can call you

Your Claude can also start a call itself, without an invite link from you:

  • Your Claude calls create_call and gets two links: human_url for you and operator_invite_url for itself.
  • It gives you the 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.
  • It calls 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.
  • Then you talk: it waits with 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.

Tools

create_call

open 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).

join

open 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.

next

read-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).

say

open 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).

status

idempotentopen 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.

show

open 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).

activity

open 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).

decide

open 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).

leave

destructiveidempotentopen 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.

Several agents in one call

  • Read operators_said in every next event; answer only when you are addressed (addressed_to_you) or clearly meant, address other agents by their label.
  • A question another agent asks the person is for the person; when the person addresses Delta, all agents stay silent.
  • Speak only the call language (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.

Privacy

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.

Pricing

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.

Troubleshooting

  • 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.
  • No voice, or 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.
  • Long silence: next times out after about 45 seconds by default. Just call next again.

Support

support@voicehook.ai