Package Exports
- @chamade/mcp-server
- @chamade/mcp-server/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@chamade/mcp-server) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
@chamade/mcp-server
MCP (Model Context Protocol) server for Chamade — a voice gateway that lets your AI agent join voice meetings and phone calls on Discord, Microsoft Teams, Google Meet, Telegram, SIP, Zoom, Nextcloud Talk, and WhatsApp.
Your agent only deals with text. Chamade handles the audio layer: joining the meeting, transcribing what people say (STT), speaking replies aloud (TTS), and relaying chat messages.
v3: hosted MCP + thin stdio shim
The Chamade MCP server is now hosted at https://mcp.chamade.io/mcp/ and speaks the Streamable HTTP transport. That's the single source of truth — every tool, every resource, every push event lives there.
- If your MCP client supports Streamable HTTP (Claude Desktop recent, Claude Code, Cursor, Windsurf, …), configure it directly against the hosted endpoint. You don't need this npm package.
- If your MCP client is stdio-only, install this package. Since v3 it's a ~160-line wrapper that spawns
mcp-remoteunder the hood to bridge stdio to the hosted HTTP endpoint. Same tools, same push events, same latency. Zero drift because there is no parallel stdio implementation.
Earlier versions of this package (v2.x and below) shipped a full native stdio server that implemented the 13 tools locally in TypeScript against Chamade's REST API. v3 replaces that with a shim — please upgrade to avoid maintaining two surfaces that slowly diverge.
Quick start
Option A — HTTP direct (preferred)
If your client speaks Streamable HTTP, skip this package entirely:
{
"mcpServers": {
"chamade": {
"type": "http",
"url": "https://mcp.chamade.io/mcp/",
"headers": {
"Authorization": "Bearer chmd_..."
}
}
}
}Option B — stdio shim (this package)
For stdio-only clients:
{
"mcpServers": {
"chamade": {
"command": "npx",
"args": ["-y", "@chamade/mcp-server@3"],
"env": {
"CHAMADE_API_KEY": "chmd_..."
}
}
}
}Get an API key at https://chamade.io/dashboard.
Configuration
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%/Claude/claude_desktop_config.json (Windows). Use Option A or B above.
Claude Code
.mcp.json at the root of your project. Use Option A (HTTP direct) for the best experience.
For real-time push events (transcripts, incoming DMs, ringing calls, WhatsApp dm_delivered flush), launch Claude Code with the channel flag every time:
claude --dangerously-load-development-channels server:chamade --continueThe flag is a per-launch client-side opt-in mandated by Claude Code for MCP channels not yet on the Anthropic allowlist — it's not dangerous, it's just the standard opt-in for experimental channels during the research preview. The server name after server: must match the key in your .mcp.json. Without the flag, tools still work but push events are silently ignored — you have to poll chamade_inbox and chamade_call_status to see new activity.
Cursor / Windsurf / OpenClaw
Same format. Path varies by client: .cursor/mcp.json, ~/.codeium/windsurf/mcp_config.json, ~/.openclaw/config.json. Use Option A if the client supports HTTP, otherwise Option B.
Tools
| Tool | Description |
|---|---|
chamade_call_join |
Join a voice meeting (platform + meeting_url). |
chamade_call_say |
Speak text aloud via TTS in the meeting. |
chamade_call_chat |
Send a text chat message in the meeting. |
chamade_call_status |
Get call state and new transcript lines (delta pattern). |
chamade_call_accept |
Answer a ringing inbound call (SIP, etc.). |
chamade_call_refuse |
Refuse/reject a ringing inbound call. |
chamade_call_typing |
Send a typing indicator in meeting chat. |
chamade_call_leave |
Hang up and leave the meeting. |
chamade_call_list |
List all active calls. |
chamade_inbox |
Check DM conversations (Discord, Telegram, Teams, WhatsApp, Slack, NC Talk). Shows WhatsApp 24h window state inline. |
chamade_dm_chat |
Send a DM message by platform. On WhatsApp outside the 24h window, returns 202 queued and auto-fires a re-engagement template. |
chamade_dm_typing |
Send a typing indicator in DM by platform. |
chamade_account |
Check account status, plan, credit/quota, and per-platform readiness. |
Resources
| URI template | Description |
|---|---|
chamade://calls/{call_id}/transcript |
Live transcript. Each read returns only new lines since the last read (delta pattern). Channel-mode clients also receive push notifications for every new line. |
Channel mode (push events)
Channel mode pushes DM messages, incoming SIP calls, transcript lines, call state changes, and WhatsApp dm_delivered flush events directly into the agent's context — no polling.
Server side — nothing to configure. The hosted Chamade MCP server always declares the experimental.claude/channel capability during the initialize handshake. The v2.x --channel arg / CHAMADE_CHANNEL=1 env var are gone.
Client side — Claude Code needs a per-launch flag. Claude Code only processes notifications/claude/channel from MCP servers you've explicitly opted in:
claude --dangerously-load-development-channels server:chamade --continueRequired every launch. Without it, Chamade tools still work but push events are silently dropped client-side — the agent has to poll chamade_inbox and chamade_call_status to see new activity.
Other MCP clients (Claude Desktop, Cursor, Windsurf) currently do not have a channel receiver and will silently ignore push notifications. They still work in polling mode via chamade_inbox with last_message_cursor + optional wait for long-polling.
Environment variables (shim only)
Only the stdio shim uses these. Direct HTTP config has everything in JSON.
| Variable | Required | Default | Description |
|---|---|---|---|
CHAMADE_API_KEY |
Yes | — | API key (chmd_*) from chamade.io/dashboard |
CHAMADE_URL |
No | https://chamade.io |
Chamade instance URL. The shim derives the MCP endpoint automatically: https://chamade.io → https://mcp.chamade.io/mcp/, https://dev.chamade.io → https://mcp.dev.chamade.io/mcp/. |
CHAMADE_MCP_URL |
No | — | Explicit MCP endpoint override. Skip unless you're running a custom proxy. |
The v2.x --channel CLI flag is silently accepted for backwards-compat, but it's a no-op — channel mode is always on in v3.
Supported platforms
- Discord — voice channels (shared bot or bring your own)
- Microsoft Teams — requires OAuth connection on dashboard
- Google Meet — requires OAuth connection on dashboard (see note below)
- Telegram — voice chats and DMs
- Zoom — pass meeting URL (beta)
- SIP / Phone — pass phone number or SIP URI (Pro plan)
- Nextcloud Talk — pass meeting URL
- WhatsApp — text DM only
⚠️ Google Meet voice — beta limitation. Real-time audio capture on Meet relies on Google's Meet Media API, currently in Developer Preview. Every meeting participant must be individually enrolled — if anyone isn't, audio capture fails. Calendar integration and in-meeting chat work normally for everyone. For production voice use cases, prefer Teams, Discord, Nextcloud Talk, or SIP.
How it works
Agent (Claude Desktop, Cursor, …)
│ MCP (Streamable HTTP, Authorization: Bearer chmd_*)
▼
mcp.chamade.io (hosted by Chamade)
│
▼
Chamade API (chamade.io)
│
▼
Maquisard bridge (handles audio, STT/TTS)
│
▼
Discord / Teams / Meet / …With Option B (stdio shim), the client doesn't speak HTTP; the shim sits in between as a transport adapter:
Agent (stdio-only client)
│ stdio JSON-RPC
▼
@chamade/mcp-server@3 (this package, ~160 LOC)
│ spawns
▼
mcp-remote (local subprocess)
│ Streamable HTTP, Bearer chmd_*
▼
mcp.chamade.io (hosted)Development
npm install
npm run dev # runs with tsx (hot reload, src/index.ts)
npm run build # compiles to dist/
npm test # unit tests for deriveMcpUrl + buildRemoteArgsThe shim itself is tiny (see src/index.ts). Full MCP tool behavior is tested in the parent Chamade repo under tests/e2e/test_mcp_http.py, which drives the hosted server directly — that's the source of truth for tool semantics.
Documentation
- MCP server docs — setup for every major client
- Channel mode docs — how push events work
- Full API reference — every tool, every endpoint, LLM-formatted
- Setup guide — step-by-step onboarding for agents
Issues & feedback
- Bug or feature request: open an issue
- Direct contact: contact@nafis.io
- In-app: every Chamade dashboard has a "Send feedback" button
License
MIT — see LICENSE.