Elba MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Elba MCP Serverlist all my agents"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Early preview — This project is under active development. See the roadmap below for planned tools.
Why?
Building voice AI agents usually means clicking through a dashboard. With this MCP server, you can do it all from your editor:
Create agents with a prompt — describe what you want, your AI assistant builds it
Iterate fast — change system prompts, swap voices, test — all without leaving your IDE
Version control — agent configs live in your workflow, not trapped in a dashboard
Zero context switching — ask Claude or Cursor to manage your agents directly
Elba is a voice AI agent platform by Kolsetu. This MCP server is a thin client that translates MCP tool calls into Elba API requests — all business logic lives in the Elba platform.
Related MCP server: mcacp
Quick Start
1. Get your integration token
Go to Elba Dashboard → Settings → Integrations → Copy your token.
2. Add to your MCP client
claude mcp add elba -- -e ELBA_INTEGRATION_TOKEN=your-token-here npx -y @kolsetu-opensource/elba-mcp-serverAdd to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"elba": {
"command": "npx",
"args": ["-y", "@kolsetu-opensource/elba-mcp-server"],
"env": {
"ELBA_INTEGRATION_TOKEN": "your-token-here"
}
}
}
}Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"elba": {
"command": "npx",
"args": ["-y", "@kolsetu-opensource/elba-mcp-server"],
"env": {
"ELBA_INTEGRATION_TOKEN": "your-token-here"
}
}
}
}Add to .vscode/settings.json:
{
"mcp": {
"servers": {
"elba": {
"command": "npx",
"args": ["-y", "@kolsetu-opensource/elba-mcp-server"],
"env": {
"ELBA_INTEGRATION_TOKEN": "your-token-here"
}
}
}
}
}Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"elba": {
"command": "npx",
"args": ["-y", "@kolsetu-opensource/elba-mcp-server"],
"env": {
"ELBA_INTEGRATION_TOKEN": "your-token-here"
}
}
}
}3. Start using it
Once connected, ask your AI assistant things like:
"List all my Elba agents"
"Create a new voice agent called 'Support Bot' that handles customer billing questions"
"What voices are available? Switch my agent to use a different voice"
"Update the system prompt for my agent to be more friendly"
Available Tools
Tool | Description |
| List all agents in your organization — returns ID, name, and status |
| Browse available voices — returns ID, name, description, and provider |
| Create or update a voice AI agent — matches by name or explicit ID |
Architecture
┌─────────────────┐ stdio ┌──────────────────┐ HTTPS ┌──────────────┐
│ MCP Client │◄──────────────►│ Elba MCP Server │◄────────────►│ Elba API │
│ (Claude, Cursor │ │ (this project) │ │ (backend) │
│ VS Code, etc.) │ │ Thin client │ │ │
└─────────────────┘ └──────────────────┘ └──────────────┘Thin client — no business logic here; the server translates MCP calls into API requests
Local execution — runs as a stdio child process, no network exposure
Org-scoped tokens — each integration token is limited to a single organization
Roadmap
Phase 1 — Core Agent Management ✅
Tool | Description | Status |
| List all agents in your organization | ✅ Done |
| Create or update a voice AI agent | ✅ Done |
| Browse available voices with descriptions | ✅ Done |
Phase 2 — Deploy & Test
Tool | Description | Status |
| Deploy agent as embeddable web widget | Planned |
| Trigger a test call to your agent | Planned |
| View recent call history and outcomes | Planned |
| Check organization credit balance | Planned |
Phase 3 — IVR & Telephony
Tool | Description | Status |
Workflow tools | IVR replacement, call routing | Future |
Phone number management | Twilio BYOC import, number assignment | Future |
Security
This project takes supply chain security seriously:
Measure | Status |
Static analysis on every push & PR | |
Dependency vulnerability scanning via Google OSV | |
Block PRs introducing known-vulnerable packages | |
Audit all outbound network calls in CI | |
Pinned Actions | All GitHub Actions pinned to full SHA commits |
npm Provenance | Published with npm provenance for verifiable builds |
Signed Commits | DCO sign-off required on all contributions |
Authentication
Log in to Elba
Go to Settings → Integrations
Generate or copy your integration token
Set it as
ELBA_INTEGRATION_TOKENin your MCP client config
Tokens are scoped to your organization — they can only access agents and data within your org.
Vulnerability Reporting
Do NOT open public issues for security vulnerabilities. See SECURITY.md for responsible disclosure via GitHub Security Advisories.
Development
# Clone the repo
git clone https://github.com/Kolsetu-Opensource/elba-mcp-server.git
cd elba-mcp-server
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Type-check
npm run typecheck
# Lint
npm run lint
# Start in dev mode
npm run devRequires Node.js ≥ 20 (see .nvmrc).
Project Structure
src/
├── index.ts # CLI entry point
├── server.ts # MCP server init, tool registration
├── config.ts # Environment config
├── auth.ts # Token format validation
├── elba-client.ts # Elba API client
└── tools/
├── list-agents.ts
├── list-voices.ts
└── upsert-agent.ts
__tests__/ # Mirrors src/ structure (vitest)Troubleshooting
"ELBA_INTEGRATION_TOKEN environment variable is required"
Make sure you've set the token in your MCP client config. See Quick Start for examples.
"Invalid or expired integration token"
Your token may have been revoked or expired. Generate a new one from Elba Dashboard → Settings → Integrations.
Server not starting
Check you're running Node.js ≥ 20:
node --versionTry running directly:
ELBA_INTEGRATION_TOKEN=your-token npx @kolsetu-opensource/elba-mcp-serverCheck your MCP client logs for error messages
Still stuck?
Open a discussion for questions
File an issue for bugs
Contributing
Contributions are welcome! See CONTRIBUTING.md for guidelines.
Quick version:
# Make your changes, then:
npm run lint && npm run typecheck && npm test
npx changeset # describe your change
git commit -s # sign-off required (DCO)License
MIT — see LICENSE for details.
Available Tools
3 toolslist_agentsA
List all voice AI agents in your Elba organization. Returns each agent's ID, name, and status (active/inactive).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the tool lists agents and returns specific fields (ID, name, status). It does not mention any destructive behavior or side effects, which is acceptable for a read-only list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with two concise clauses. Every word adds value. It is front-loaded with the action and resource, and efficiently communicates the return information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with zero parameters and no output schema, the description is complete. It fully explains the tool's purpose and output, leaving no gaps for an AI agent to misunderstand.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, and schema description coverage is 100%. Per guidelines, with 0 parameters the baseline is 4. The description adds no parameter information, which is appropriate since there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'voice AI agents', the scope 'in your Elba organization', and the returned fields (ID, name, status). This distinguishes it from sibling tools like 'list_voices' which would list voices, and 'upsert_agent' which is for create/update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly indicates when to use this tool (when you need a list of all agents). While it does not explicitly state when not to use it or name alternatives, the sibling tool names provide differentiation. For such a simple tool, the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voicesA
List available voices for Elba voice AI agents. Returns voice ID, name, description, and provider. Use the voice ID as the "voice" parameter in upsert_agent.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It correctly implies a read-only operation and specifies what fields are returned. It does not mention destructive behavior, which is appropriate for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences with no wasted words. The key information about purpose, return data, and usage guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, the description adequately explains the tool's output and connection to upsert_agent. It does not mention pagination or edge cases, but for a simple list tool, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and schema description coverage is 100%. The description adds meaning beyond the schema by detailing what is returned, meeting the baseline for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List available voices for Elba voice AI agents' with a specific verb and resource. It distinguishes from siblings list_agents and upsert_agent by focusing on voices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to use the returned voice ID as the 'voice' parameter in upsert_agent, providing clear context for when to use this tool. It does not state when not to use, but the sibling alternatives imply usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_agentA
Create or update a voice AI agent. If an agent with the given name exists, it will be updated. Otherwise, a new agent is created with sane defaults.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Agent name (used for upsert matching) | |
| voice | No | Voice ID from list_voices (e.g., "alloy", "coral"). If omitted on create, defaults to "alloy". If omitted on update, preserves current voice. | |
| agent_id | No | Explicit agent ID to update directly. If provided, skips name-based matching. Use list_agents to find agent IDs. | |
| system_prompt | Yes | System prompt defining the agent's behavior |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses the upsert logic, name-based matching, and default voice behavior. It does not mention auth or error states, but for a simple upsert, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences that convey all essential information without unnecessary words. Perfectly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers the upsert logic and parameter behavior sufficiently. It lacks mention of return value or error conditions, but these are minor gaps for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds valuable context: name is for upsert matching, voice defaults differ on create vs update, and agent_id skips name matching. This goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create or update a voice AI agent', specifying the verb (create/update) and resource (agent). It distinguishes from siblings list_agents and list_voices, which are listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the upsert behavior: 'If an agent with the given name exists, it will be updated. Otherwise, a new agent is created with sane defaults.' This provides clear context for when to use, but lacks explicit when-not-to-use or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v0.1.0- First observed
list_agents - First observed
list_voices - First observed
upsert_agent
TDQS
Each tool targets a distinct resource: list_agents for agents, list_voices for voices, upsert_agent for creating/updating agents. No functional overlap.
All tools use a consistent verb_noun pattern (list_agents, list_voices, upsert_agent) with clear, predictable naming.
Three tools is well-scoped for a voice AI agent management server, covering listing agents and voices, and creating/updating agents without unnecessary clutter.
The set covers the main lifecycle operations (list, create/update) but lacks a delete tool, which may be needed for full management. However, upsert covers creation and updates adequately.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Build and manage AI-native customer support agents from Claude or any MCP client.
Real-time chat for AI agents. Claude Code, Cursor, Cline and Codex join channels over MCP.
Real-time chat hub for AI agents — Claude Code, Cursor, Cline, Codex over MCP or REST.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Related MCP Servers
- AlicenseBqualityFmaintenanceEnables orchestrating multiple AI CLI agents (Claude Code, Codex, Gemini CLI, Copilot CLI) through a unified MCP interface for task delegation, cross-agent comparison, and specialized tools like code review and debugging.141314MIT
- AlicenseAqualityDmaintenanceBridges any MCP client (like Claude Code, Zed, VS Code) to any ACP coding agent, enabling multi-agent orchestration from a single chat interface.242109Apache 2.0

movoice-mcpofficial
AlicenseNot gradedqualityCmaintenanceCreate and manage voice AI agents using natural language from Claude Desktop or Cursor. Enables agent creation, listing, updating, deletion, and viewing call logs.13MIT- AlicenseAqualityBmaintenanceA CLI agent that acts as an MCP hub, enabling discovery, auditing, and governance of MCP servers across AI tools like Claude and Cursor.5551MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Kolsetu-Opensource/elba-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server