confcall MCP server
An MCP (Model Context Protocol) server exposing the confcall control plane — rooms, agent invite/status, transcripts, summaries, recordings — as tools, so an agentic host (Claude inside a CRM, a buyer's own orchestrator) can operate confcall without hand-rolling REST calls.
This server is a thin facade: every tool is a 1:1 wrapper over an existing confcall REST
endpoint (see API Reference), using the same sk_
secret API key auth as any other server-to-server integration. It adds no business logic of its
own — the REST surface stays the single source of truth.
Connect (hosted — nothing to install)
confcall runs the MCP server for you at https://mcp.confcall.app over
streamable-HTTP. There is nothing to install or host — point your agentic host at the URL and
send your own confcall sk_ key on every request. The hosted server
holds no key of its own; it forwards your key to the REST control plane, so tenant isolation and
rate limits are enforced by the confcall API itself.
{
"mcpServers": {
"confcall": {
"url": "https://mcp.confcall.app",
"transport": "streamable-http",
"headers": { "X-API-Key": "sk_live_YOUR_CONFCALL_KEY" }
}
}
}
Exact config shape varies by client; the essentials are the URL, the streamable-HTTP transport,
and the X-API-Key: sk_... header (Authorization: Bearer sk_... is also
accepted). A request with no key is rejected with 401 before any control-plane call
is made. The server is listed in the official MCP registry as app.confcall/mcp-server.
Get a key from the confcall dashboard.
Self-host (optional — local dev)
Distribution is the hosted endpoint above; the stdio package lives in the repo for local development and is not published to a package registry. To run it yourself over stdio (a host that spawns it as a subprocess):
npm install
npm run build
CONFCALL_API_KEY=sk_live_... node dist/index.js
…or as your own streamable-HTTP endpoint: node dist/index.js --http.
| Variable | Required | Default | Description |
|---|---|---|---|
CONFCALL_API_KEY | self-host stdio only | — | A confcall secret (sk_-prefixed) API key. Never logged, echoed, or included in a tool result. The hosted endpoint holds no key — callers send their own per request. |
CONFCALL_BASE_URL | no | https://meet.confcall.app | The confcall REST host to call. |
MCP_TRANSPORT | no | stdio | stdio or http (self-host). |
MCP_HTTP_PORT | no | 3000 | Port to listen on when MCP_TRANSPORT=http (self-host). |
Tool reference
Every REST call carries the key as X-API-Key — there is no separate MCP-level auth.
| Tool | REST call | Notes |
|---|---|---|
create_room | POST /api/embed/rooms | Creates an account-owned, embed-eligible room. |
get_room | GET /api/rooms/{roomId} | Room metadata. |
get_join_info | POST /api/embed/sessions | Mints a short-lived join token + embed URL for an external user. |
end_meeting | DELETE /api/rooms/{roomId} | Deletes the room resource. Does not force-disconnect an in-progress live call — see "Known limitations". |
invite_agent | POST /api/rooms/{roomId}/ai-agent/invite | mode (e.g. Notetaker) + language (STT pin). |
remove_agent | POST /api/rooms/{roomId}/ai-agent/remove | |
get_agent_status | GET /api/rooms/{roomId}/ai-agent/status | Degrades to { agentPresent: false, available: false } rather than erroring. |
list_sessions | GET /api/rooms/{roomId}/artifacts | Summarized (not full-transcript) list. |
get_transcript | GET /api/artifacts/{sessionId} | Full turn-by-turn transcript. |
get_summary_and_actions | GET /api/artifacts/{sessionId} | Summary, outcome, decisions, follow-ups, action items. |
list_recordings | GET /api/recordings?roomId= | roomId optional. |
get_recording_url | GET /api/recordings/{id}/stream | Time-limited pre-signed playback URL (or a BYOS out-of-band reference). |
Every tool returns a structured MCP error result — never an uncaught exception — for any REST
failure: { isError: true, content: [{ type: 'text', text: '{"error": true, "status": ..., "statusText": ..., "body": ...}' }] }.
Example agentic flow
1. create_room({ roomName: "Acme onboarding call" })
→ { roomId, embedUrl }
2. get_join_info({ roomId, externalUserId: "acme-user-42", role: "host" })
→ { token, expiresAt, embedUrl } // hand this join URL to the user
3. invite_agent({ roomId, mode: "Notetaker", language: "en" })
→ { success, sessionId }
... meeting happens ...
4. list_sessions({ roomId }) → get_summary_and_actions({ sessionId })
→ summary + action items to push into the host's CRM
5. end_meeting({ roomId })
Known limitations
Every tool above is now fully authenticatable with an sk_ key against production —
RFC-Builder-Onboarding-And-Docs Phase 1 extended the composite JWT/API-key scheme (and
account-ownership checks) to RoomsController, ArtifactsController, and
RecordingController, closing the gap this package's README originally flagged. One
limitation remains, and it's architectural rather than an auth-wiring gap:
-
end_meetinghas no REST equivalent for force-ending a live call. Live-meeting teardown isVideoConferenceHub.EndMeetingForAll, a SignalR hub RPC — there is no REST route for it. This tool deletes the persistent room record instead, which is the closest REST-reachable analog.
Development
npm run typecheck # tsc --noEmit
npm test # builds dist/, then runs the vitest suite (unit + a stdio child-process
# contract test against the real built server)
Full source: mcp-server/README.md in the confcall repo.