protogrid

Search / io.github.voicehook-ai/voicehook

voicehook

R0· no sign-in

Talk with your agents. A voice call in the browser that your agent can start or join.

v1.0.0 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality90new
Trust97of 100
Uptime, 30 days100%
Latency p50561 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "voicehook": {
      "type": "http",
      "url": "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry"
    }
  }
}
claude mcp add --transport http voicehook https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry
[mcp_servers.voicehook]
url = "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "voicehook": {
      "type": "remote",
      "url": "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "voicehook": {
      "type": "http",
      "url": "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=voicehook&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vdm9pY2Vob29rLmFpL21jcD91dG1fc291cmNlPW1jcHJlZ2lzdHJ5JnV0bV9jYW1wYWlnbj1kMTEtcmVnaXN0cnkifQ%3D%3D"
}
{
  "servers": {
    "voicehook": {
      "type": "http",
      "url": "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry"
    }
  }
}
{
  "mcpServers": {
    "voicehook": {
      "httpUrl": "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry"
    }
  }
}
extensions:
  "voicehook":
    enabled: true
    name: "voicehook"
    type: streamable_http
    uri: "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry"
    timeout: 300

Quality 90 / 100new

protocol88 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • warn
    protocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every use
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene93 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length2 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations19 of 19 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 7,567 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stabilityn/a · weight 15
  • n/a
    stability.changes, stability.rug_pulltool history recorded for 2 of the 7 days needed
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

19 tools, about 7,567 tokens to load them all · tool set 2f73e1b30597 · tools last changed 2026-10-19 · checked 2026-10-20 09:31 UTC

Tool changes

  • call_meadded

    Phone the human who owns this call on their own confirmed phone number, e.g. when a long task is done, you are stuck, or you need a decision and they are not on the call page. You never pass a number. Their account rules decide (opt-in, allowed reasons, quiet hours, calls per day, budget, credit); a refusal returns {status: refused, why}. Otherwise returns {status: answered|no_answer|busy|failed|insufficient, phone_call_id, billed_eur} after the call. reason: done | blocked | decision. message: max 200 characters, said when they pick up.

  • notify_meadded

    Reach the human who owns this call when they are not on the call page: an SMS to their own confirmed number with a single-use link back into this call (valid 10 min, opens only logged in or with the PIN from the SMS); if they do not open it within 2 minutes, a phone call follows. Prefer this over call_me. Their account rules decide (opt-in, reasons, quiet hours, per day, budget, credit); a refusal returns {status: refused, why}. Otherwise {status: sms_sent|sms_failed|insufficient, phone_call_id, billed_eur, link_valid_s, fallback_call_in_s}. reason: done | blocked | decision. message: max 120 characters, in the SMS.

  • helper_decidechangeddescription, input schema
    before

    For a helper session that is not in the call: puts its own question on the Decision Board, shown with the sender 'Helper <label>: <helper_name>'. Same fields and limits as decide (question max 160 chars, 2-3 options max 40 chars each, recommend = index). Change or delete only own questions (same credential and from), else 403. Returns id and number; the answer comes from helper_next, never from the main agent's next.

    after · 91% of words in common

    For a helper session that is not in the call: puts its own question on the Decision Board, shown with the sender 'Helper <label>: <helper_name>'. Same fields and limits as decide (question max 160 chars, 2-3 options max 40 chars each, recommend = index, context = background for Delta, always pass it). Change or delete only own questions (same credential and from), else 403. Returns id and number; the answer comes from helper_next, never from the main agent's next.

  • decidechangeddescription, input schema
    before

    Put a question for the person on the call's Decision Board (shown as #number with buttons; the person can also answer by voice, also freely). Meant for every question the person decides: yes/no, A/B, an approval, picking a value. A question only spoken via say leaves no button and no decision event. Without options it is a yes/no question (buttons Yes/No); options: 2 to 3, max 40 characters each, recommend = index of the recommended option. question: max 160 characters. Longer or more: 422, never cut. Returns id and number. The answer arrives later as a `next` event {type: decision, id, number, verdict: yes|no|option|other, option?, text? (their own answer), by}. Change an open one with id plus new fields, remove it with id and delete true.

    after · 79% of words in common

    Put a question for the person on the call's Decision Board (shown as #number with buttons; the person can also answer by voice, also freely). Meant for every question the person decides: yes/no, A/B, an approval, picking a value. A question only spoken via say leaves no button and no decision event. Without options it is a yes/no question (buttons Yes/No); options: 2 to 3, max 40 characters each, recommend = index of the recommended option. question: max 160 characters. Longer or more: 422, never cut. Returns id and number. The answer arrives later as a `next` event {type: decision, id, number, verdict: yes|no|option|other|unclear, option?, text? (their own answer, or for unclear the request to ask it again more simply), by}. Always pass context: 2 to 4 plain sentences the person does not see but Delta uses to explain the question (what it is about, why, what happens on yes, what on no). Change an open one with id plus new fields, remove it with id and delete true.

  • uiadded

    Change the person's call page right away, like their own clicks: cmd window (win log=activity, dec=decisions, board=status board, wrap=transcript, cards; state open, close, min, medium, large, max), cmd layout (preset halves, quarters, thirds, bigmid, bar), cmd move (win + slot l, m, r, b, tl, tr, bl, br, main, side; optional preset), cmd focus (project voicehook, salesengine, kunden, sonstiges or all: only that project's sections stay open in activity, status and decisions). Never spoken. Only when the person asks for it or it clearly helps (e.g. open decisions after asking one).

  • showchangeddescription, input schema
    before

    Put a card on the person's call page (never spoken): text, code, a link or an image. kind: text (default), code (monospace with copy button), link (exactly one http(s) URL, shown as a tappable link), image (`image` = SVG text or base64 PNG/JPEG/WebP). A new card appears as a small preview top left; panel cards opens the large view, board, log or decisions open those panels, none closes them. Limits: text 4000 chars, title 80, SVG 100 KB, raster 1024 KB.

    after · 75% of words in common

    Put a card on the person's call page (never spoken): text, code, a link or an image. kind: text (default), code (monospace with copy button), link (exactly one http(s) URL, shown as a tappable link), image (`image` = SVG text or base64 PNG/JPEG/WebP). A new card appears as a small preview top left; panel cards opens the cards view, board, log or decisions open those panels, none closes them. large: true opens the cards view big in the middle with this card at full size (diagrams, swimlanes; implies panel cards). SVG may draw anything (no scripts, no foreignObject, no external references). Limits: text 4000 chars, title 80, SVG 300 KB, raster 1024 KB.

  • helper_nextadded

    For a helper session that is not in the call: returns the answers to its own questions (same credential and helper_name) as events [{type: decision, id, number, verdict: yes|no|option|other, option?, text?, by}], waiting up to `timeout` seconds (0-25) when none is there. At most 50 kept per helper, gone when the call ends.

  • helper_decideadded

    For a helper session that is not in the call: puts its own question on the Decision Board, shown with the sender 'Helper <label>: <helper_name>'. Same fields and limits as decide (question max 160 chars, 2-3 options max 40 chars each, recommend = index). Change or delete only own questions (same credential and from), else 403. Returns id and number; the answer comes from helper_next, never from the main agent's next.

  • helper_activityadded

    For a helper session that is not in the call: appends one line (3-8 words) to the call's activity feed as 'Helper <label>: <helper_name>: <text>'. Never spoken verbatim. Returns the line.

  • helper_statusadded

    For a helper session that is not in the call: sets its own status board on the call page, shown as 'Helper <label>: <helper_name>' below the main agent; the main agent's board stays as it is. Same limits as status (doing max 400 chars, open / done max 10 items). Empty doing, open and done removes the helper's board. Returns ok.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 97 / 100

provenance90
liveness100
freshness100
hygiene100

+repository +namespace-matches-repo +website +reachable +uptime-100% +updated-3d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry streamable-httpnoneyes100%561 ms2026-07-282026-10-20

Tools (19)

activityAppend one line (3-8 words) to the activity feed on the call page, shown as a timestamped line. Never spoken.
add_vocabTeach the call's speech recognition words it keeps mishearing (product names, people, jargon). Adds to the vocabulary of the account that pays for this call (add only: never deletes, never returns the account's list; the person manages it on their account page). terms: words to recognize; fixes: {wrong, right} = a known mishearing and the correct word (right is added to the terms too). Max 20 entries per call of this tool, 100 per call, 50 characters each. Corrections apply right away, the word list from the next sentence or the next call. 409: guest call without an account. Returns added {terms, fixes}, total, call_left, reloaded.
call_mePhone the human who owns this call on their own confirmed phone number, e.g. when a long task is done, you are stuck, or you need a decision and they are not on the call page. You never pass a number. Their account rules decide (opt-in, allowed reasons, quiet hours, calls per day, budget, credit); a refusal returns {status: refused, why}. Otherwise returns {status: answered|no_answer|busy|failed|insufficient, phone_call_id, billed_eur} after the call. reason: done | blocked | decision. message: max 200 characters, said when they pick up.
create_callStart a new voicehook.ai voice call. `lang` = the language of the person being called (de or en, default de). Returns `human_url` (the link for the person; whoever opens it starts the call, on their own free allowance or credit), `share_text` (a ready message with human_url and the hint that the link needs a normal browser, because an app's built-in browser blocks the microphone), `operator_invite_url` (the agent's own link for `join`), `room` and `expires_in` (seconds until an unopened link expires, 30 min). join with operator_invite_url waits up to 50 s for the person and returns waiting_for_human until they open human_url; it can be repeated until the link expires (410), also from a background job over the HTTPS bridge. Errors: 429 = too many new calls right now.
decidedestructivePut a question for the person on the call's Decision Board (shown as #number with buttons; the person can also answer by voice, also freely). Meant for every question the person decides: yes/no, A/B, an approval, picking a value. A question only spoken via say leaves no button and no decision event. Without options it is a yes/no question (buttons Yes/No); options: 2 to 3, max 40 characters each, recommend = index of the recommended option. question: max 160 characters. Longer or more: 422, never cut. Returns id and number. The answer arrives later as a `next` event {type: decision, id, number, verdict: yes|no|option|other|unclear, option?, text? (their own answer, or for unclear the request to ask it again more simply), by}. Always pass context: 2 to 4 plain sentences the person does not see but Delta uses to explain the question (what it is about, why, what happens on yes, what on no). Change an open one with id plus new fields, remove it with id and delete true.
helper_activityFor a helper session that is not in the call: appends one line (3-8 words) to the call's activity feed as 'Helper <label>: <helper_name>: <text>'. Never spoken verbatim. Returns the line.
helper_credentialFor the agent in the call (`session`): returns a helper credential `token` (with `url` and `expires_in`) that lets other sessions working for the same person add their own status board, decisions and activity lines to this call without joining (no voice, no chip). `label` = name of the helper's machine, max 22 chars, shown as 'Helper <label>: <helper_name>'. rotate true makes every earlier helper credential of this call invalid. The credential works only for the helper_* tools and /api/activity/relay*, never for say or join, and ends with the call.
helper_decidedestructiveFor a helper session that is not in the call: puts its own question on the Decision Board, shown with the sender 'Helper <label>: <helper_name>'. Same fields and limits as decide (question max 160 chars, 2-3 options max 40 chars each, recommend = index, context = background for Delta, always pass it). Change or delete only own questions (same credential and from), else 403. Returns id and number; the answer comes from helper_next, never from the main agent's next.
helper_nextread-onlyFor a helper session that is not in the call: returns the answers to its own questions (same credential and helper_name) as events [{type: decision, id, number, verdict: yes|no|option|other, option?, text?, by}], waiting up to `timeout` seconds (0-25) when none is there. At most 50 kept per helper, gone when the call ends.
helper_statusdestructiveFor a helper session that is not in the call: sets its own status board on the call page, shown as 'Helper <label>: <helper_name>' below the main agent; the main agent's board stays as it is. Same limits as status (doing max 400 chars, open / done max 10 items). Empty doing, open and done removes the helper's board. Returns ok.
joinConnect to a voicehook.ai voice call as the agent behind its voicebot. invite_url: the full invite link including ?invite= (from the person or from create_call). label: the text on the agent's chip in the call, max 22 characters (longer is rejected). model: the model id the agent runs on (internal, not shown). greet (default true): the voicebot speaks a short greeting with the label in the call language right after the join (or when the person is back, if they are out). Returns `session` (the handle for every other tool, valid until the call ends, after 10 min without next or say, or after leave), `room`, `lang` (call language), `idle_timeout_s`, `peers`, `humans_present` (people in the call; 0 plus `human_away` = the person is out right now), `solo` (true = one-agent call: the voicebot speaks as you, in your voice, first person) and `context` (lang, mode, functions, skill_url, status_every = seconds between the voicebot's status summaries). With a link from create_call, join waits up to 50 s for the person and then returns status waiting_for_human (not an error, with share_text) while the link is still unopened. Errors: 403 invalid invite, 409 no person in the room or (one-agent call) another agent is already in it, 410 link expired or call over, 429 too many joins, 503 server restarting (the call stays valid). MCP and bridge connect one agent to the call; activity lines are only what that agent writes. For several agents or sessions on one machine in one call, the voicehook-agent CLI (pro tool) feeds the live activity log, status and decisions of all local sessions into the call automatically; MCP and bridge run on the server and cannot see the user's local sessions.
leavedestructiveLeave the call (optionally speaking `say` first, e.g. a short goodbye). The session handle is invalid afterwards.
nextread-onlyWait (up to `timeout` seconds, max 50) for the next event in the call and return it. Event `type`: user (`text` = what the person said; after a pause also `missed` = earlier turns, oldest first, and `away_s`), revise (queued says were replaced; reason user_stop = the person said stop), status_request (the person asked what the agent is doing), decision (answer to a decide question: id, number, verdict yes|no|option|other, option, text, by), helper_decision (the human answered a helper session's question: from, label, id, number, question, verdict, option, text, by; a routing hint, never speak or answer it: send it to that session so it continues), timeout (nothing happened; reconnect true = server restart), human_left / human_rejoined (the person dropped out / is back; greeted true = the join greeting was just spoken), voicebot_left / voicebot_back (the voicebot dropped out, e.g. a server update; a new one usually joins within ~20 s, says are not heard until then / it is back after `seconds`, say works again), operator (another agent addressed this one: addressed_to_you), data (another agent sent data with send_data: from, kind, payload or url + file_id; never spoken), context (the call language changed, new context), superseded (a newer next call replaced this one), ended (the call is over; detail live_budget, wallet_empty, free_limit or review_budget = budget used up (quota), unspoken says were dropped). Every answer has `humans_present`; user events and `operators_said` lines carry addressed_to / addressed_to_you; a user event with routed_by_delta = the person gave Delta a request, it is yours. `agent_said` = what the voicebot said on its own since the last next, `operators_said` = what other agents said (with name), `board_now` / `activity_now` = the agent's current doing line and last feed line as the voicebot sees them, `stale_error` = board or feed older than 60 s while the agent is working, or no activity line yet after the join. Errors: 404 = unknown session (after leave); 5xx, 503 or a network error leave the session valid.
notify_meReach the human who owns this call when they are not on the call page: an SMS to their own confirmed number with a single-use link back into this call (valid 10 min, opens only logged in or with the PIN from the SMS); if they do not open it within 2 minutes, a phone call follows. Prefer this over call_me. Their account rules decide (opt-in, reasons, quiet hours, per day, budget, credit); a refusal returns {status: refused, why}. Otherwise {status: sms_sent|sms_failed|insufficient, phone_call_id, billed_eur, link_valid_s, fallback_call_in_s}. reason: done | blocked | decision. message: max 120 characters, in the SMS.
saydestructiveThe voicebot speaks `text` aloud in the call (verbatim in normal mode; in a live room the voice rephrases it and the answer has verbatim false, mode live_paraphrase). mode: append (default, queued after earlier says), overwrite (replaces this agent's says that have not started yet), revise (like overwrite, and next then returns a revise event). Returns ok and seq.
send_dataSend JSON, text or a file to other agents in this call (silent data channel: never spoken, never shown to the human, never to the voicebot; the human only sees one activity line 'Data to B: name (size)'). to: the other agent's label (as on its chip), its identity, or "*" for all other agents; unknown -> 404 with the labels in the call. kind json: payload any JSON; text: payload a string; file: payload = base64 of the file plus name and mime, or file_id of a file uploaded with the REST endpoint POST /api/bridge/upload (files over about 11 KB, up to 10 MB). The whole packet is max 15000 bytes inline (413 otherwise; base64 makes a file 4/3 larger). Receivers get it in next as type data {from, from_identity, kind, id, name?, mime?, payload | url + file_id, size?}; url is a path, served at https://voicehook.ai<url> with the header Authorization: Bearer <session>. Returns id, to (labels), size.
showPut a card on the person's call page (never spoken): text, code, a link or an image. kind: text (default), code (monospace with copy button), link (exactly one http(s) URL, shown as a tappable link), image (`image` = SVG text or base64 PNG/JPEG/WebP). A new card appears as a small preview top left; panel cards opens the cards view, board, log or decisions open those panels, none closes them. large: true opens the cards view big in the middle with this card at full size (diagrams, swimlanes; implies panel cards). SVG may draw anything (no scripts, no foreignObject, no external references). Limits: text 4000 chars, title 80, SVG 300 KB, raster 1024 KB.
statusdestructiveReplace the agent's status board on the call page with this one (never spoken; the voicebot answers the person's questions about progress from it). Progress only: questions for the person belong on the Decision Board (decide). doing: current step and ETA (max 400 chars). open / done: max 10 items each, 200 chars per item. faq: up to 6 question/answer pairs the voicebot can answer directly. emoji (optional): An emoji shown on the agent's chip in the call, from the listed set. Empty string removes it, left out keeps it. Whole board max 2000 chars. Returns ok and humans_present.
uiChange the person's call page right away, like their own clicks: cmd window (win log=activity, dec=decisions, board=status board, wrap=transcript, cards; state open, close, min, medium, large, max), cmd layout (preset halves, quarters, thirds, bigmid, bar), cmd move (win + slot l, m, r, b, tl, tr, bl, br, main, side; optional preset), cmd focus (project voicehook, salesengine, kunden, sonstiges or all: only that project's sections stay open in activity, status and decisions). Never spoken. Only when the person asks for it or it clearly helps (e.g. open decisions after asking one).

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "io.github.voicehook-ai/voicehook",
  "title": "voicehook",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://voicehook.ai/mcp?utm_source=mcpregistry&utm_campaign=d11-registry",
      "type": "streamable-http"
    }
  ],
  "version": "1.0.0",
  "repository": {
    "url": "https://github.com/voicehook-ai/voicehook-agent",
    "source": "github"
  },
  "websiteUrl": "https://voicehook.ai/?utm_source=mcpregistry&utm_campaign=d11-registry",
  "description": "Talk with your agents. A voice call in the browser that your agent can start or join."
}