Hermes on the Phone
AgentCall gives your Hermes agent a real phone number you can call. Your AI agent answers in a natural voice, speaks with your latest priorities and email updates loaded, and the conversation flows back into your agent's memory after you hang up. Works with any self-hosted Hermes setup (VPS, container, local) connected to Telegram, Discord, Slack, Signal, WhatsApp, Matrix, or any of the 20+ messaging platforms Hermes supports. Email integration is provider-agnostic via IMAP/SMTP: Gmail, Outlook, ProtonMail, Fastmail, iCloud, Zoho, self-hosted, all work.
A Day in the Life: David and Laura
David is a CEO. Laura is his AI strategist, running on Hermes. Here is what a normal morning looks like once the full integration is wired up: Laura reads his inbox, builds a brief, pushes it to the bridge, and David talks her through priorities from his car. Laura then acts on the decisions automatically.
Laura: “Hey David, what do you want to dig into?”
David: “Walk me through what's on the table this morning.”
Laura: “Three updates from your inbox. Sarah at Acme is asking for a 30-minute slot this week, sounds positive on the enterprise deal. Your cofounder confirmed Tuesday. Bridgewater needs Q3 by Friday. What do you want to tackle first?”
David: “Sarah. Set up Wednesday 2 PM CT with her. Outline three talking points I should hit. And tell my cofounder I'm in for Tuesday.”
Laura: “Got it. I'll handle those when we hang up.”
What each piece does in the loop:
- Inbox reading (IMAP): raw material for the morning brief. Without this, Laura has nothing to say beyond what David puts into Telegram manually.
- Bridge push: makes the same brief available to the AI on the phone, so the call works wherever David picks up (car, walk, plane).
- Post-call webhook: feeds the conversation back into Laura's memory so tomorrow's brief can reference the decisions David made today.
- SMTP send: lets Laura execute on decisions from the call by drafting and sending real emails.
You read the brief in the morning, talk through priorities with Laura on the phone, and she handles the execution. You don't type every reply or read every email.
Before You Start
You need:
- Hermes already running (VPS, container, or local). New to Hermes? Start at hermes-agent.nousresearch.com.
- Hermes connected to at least one messaging platform. Telegram is the most common, but anything Hermes supports works (Discord, Slack, Signal, WhatsApp, Matrix, etc.).
- Hermes connected to an email account if you want daily briefs flowing into your calls (any IMAP/SMTP provider: Gmail, Outlook, ProtonMail, Fastmail, iCloud, a self-hosted server, etc.).
- An AgentCall API key. Free tier provisions one US local number and gives you 5 minutes of inbound AI voice trial per month. Get one here.
Two Ways to Run This
Simple Receptionist
You call a number, the AI answers with a static persona you set once. No live context. Fastest path: ~5 minutes.
Setup Steps 1 to 3 below.
Live Context Loop
Your agent pushes today's brief and email updates to a small always-on bridge. The voice agent fetches that on every call. Phone conversation feels like talking to someone who already knows what's going on.
Setup Steps 1 to 5 below.
Setup
Connect AgentCall to Hermes (one config change)
Add AgentCall as an MCP server in your Hermes config, then restart the gateway. Hermes auto-discovers all 23 phone tools on the next startup.
mcp_servers:
agentcall:
url: https://api.agentcall.co/mcp
headers:
Authorization: "Bearer ac_live_xxxxxxxxxxxxx"Restart Hermes (e.g. docker compose restart or the equivalent for your setup). After restart, open Telegram and message Hermes to confirm:
“What phone tools do you have access to right now?”
Hermes should list provision_number, configure_inbound_ai, update_number_voice, and others. If it says no AgentCall tools, the MCP connection didn't pick up. Double-check the URL and API key in the config.
Provision a phone number from Telegram
You don't need to log into a dashboard. Just ask Hermes:
“Provision a US phone number with area code 314 and label it Laura.”
Hermes calls provision_number and reports back with the new number in E.164 format (e.g. +13145551234) and the number ID. Save both — you'll reference the ID in Step 3.
Free tier provisions one number free. Local-only on Free; toll-free and mobile types need Pro.
Set up the receptionist persona from Telegram
Tell Hermes what voice, prompt, and first message to use on your number:
“Configure inbound AI on number num_xxx. Use the marin voice. First message: “Hey, what do you want to talk through?” System prompt: “You are my assistant. Keep replies tight. Recap decisions and action items at the end of the call.” Max duration 1800 seconds.”
Hermes calls configure_inbound_ai with your persona. Test it now: call the number you got back in Step 2. The AI should answer in the marin voice and follow your prompt. If this is all you need, you're done.
To change the voice later without losing the rest of the config, just ask: “Change the voice on num_xxx to coral.” Hermes uses update_number_voice which is a partial update.
Wire live context (optional, advanced)
Step 4At this point your AI receptionist works with a static prompt. To make it speak with TODAY's context (latest brief, fresh email updates, current priorities), you need a small always-on bridge that your agent pushes context to. AgentCall fetches from that bridge on every inbound call.
The bridge is a 100-line Cloudflare Worker. Source is open at Kintupercy/agentcall-hermes-bridge. Clone, point it at your own subdomain (e.g. hermes.your-domain.com), and deploy with two wrangler commands.
# In the cloned agentcall-hermes-bridge folder:
npx wrangler kv namespace create HERMES_CONTEXT
# (copy the namespace ID into wrangler.jsonc)
npx wrangler secret put AGENTCALL_SIGNING_SECRET
# paste a 32-byte hex secret (openssl rand -hex 32)
npx wrangler secret put HERMES_PUSH_KEY
# paste a different random secret Hermes will use
npx wrangler deploy
# point hermes.your-domain.com at the deployed Worker in Cloudflare DNSThen tell Hermes to wire the number to your new bridge:
“Update inbound AI on num_xxx to also set contextWebhook with url https://hermes.your-domain.com/agentcall/precall and signingSecret <the AGENTCALL_SIGNING_SECRET you just set>.”
Hermes calls configure_inbound_ai with the full config plus the contextWebhook block. AgentCall now hits your bridge on every inbound call.
Wire Hermes scheduled briefs to the bridge
Step 5If you have Hermes already generating daily briefs (e.g. it reads your inbox in the morning and sends you a summary), add one more step to that same job: also POST the brief to your bridge. Same content, two destinations.
“When you generate my daily brief, also send it to my AgentCall bridge. POST to https://hermes.your-domain.com/hermes/push with header X-Hermes-Push-Key set to <the HERMES_PUSH_KEY you set>, JSON body containing a single field named contextBlock with the brief text as its value. Keep the brief under 5000 chars.”
Hermes adds the push step to its scheduled task. Next time it runs (whatever cadence you have — daily, hourly, on-demand), the latest brief lands on the bridge and gets served to your next inbound call.
Test the full loop: call your number after the next scheduled brief fires, and ask: “What's in today's brief?”. The AI should recite the actual content, not a generic answer.
Email Integration Note
Hermes connects to email via IMAP/SMTP, which means any email provider works:
Gmail, Outlook / Microsoft 365, ProtonMail, Fastmail, iCloud Mail, Zoho, your own self-hosted server. Configure it once on the Hermes side; from then on, Hermes can read your inbox to build briefs and the same briefs flow through to AgentCall on your phone calls.
See the Hermes docs for IMAP/SMTP setup specifics: hermes-agent.nousresearch.com/docs.
Optional: Post-Call Recap Back to Hermes
By default the call transcript lives in your AgentCall dashboard and is fetchable via API. If you also want Hermes to ingest every call recap into memory automatically, register a webhook:
“Register an AgentCall webhook for call.transcript events pointing at https://hermes.your-domain.com/agentcall/transcript.”
Hermes calls create_webhook. After every call ends, AgentCall POSTs the full transcript and an LLM-generated summary (caller, intent, urgency, callback time) to your endpoint. Hermes ingests it and can act on action items on its own schedule.
Troubleshooting
Hermes says it has no phone tools
MCP connection didn't pick up. Check the URL (https://api.agentcall.co/mcp) and the API key in your Hermes config. Restart the Hermes gateway. Some Hermes setups cache the tool catalog; a hard restart of the gateway process fixes that.
AI answered but with no context (Step 4 done)
Two common causes:
- Bridge KV is empty — Hermes didn't push yet, or the push failed silently. Trigger a manual brief and try again.
- Signing secret mismatch — the number's contextWebhook.signingSecret has to byte-match the AGENTCALL_SIGNING_SECRET on the Worker.
AgentCall fails open on context webhook errors. The call still answers, just without your brief.
Changing voice wiped the rest of the config
Don't use configure_inbound_ai to change just the voice. It replaces the entire inbound config. Tell Hermes: “Change the voice on num_xxx to coral.”. That uses update_number_voice which merges the new voice and keeps everything else intact.
Call hangs up at 5 minutes
Free tier includes 5 minutes/month of inbound AI voice trial. Past that, calls hang up until the 1st of the next month (UTC) or you upgrade to Pro for unlimited inbound at $0.40/min.
Reference
Ready to give Hermes a phone number?
Get a free API key, connect AgentCall to your Hermes gateway, and ask Hermes to set up the rest. Live in under ten minutes.
Get API Key, Free