Voice Assistant MCP Server

by prakharbhardwaj

353 downloads Not rated yet

About

A Model Context Protocol (MCP) server that integrates Twilio Voice, Deepgram AI, and OpenAI to create intelligent voice-based HR automation tools.

Explore

- AI-Powered Voice Interviews: Conduct professional phone interviews with candidates using AI
- Interview Result Notifications: Automatically call candidates with interview results and feedback
- Job Opportunity Outreach: Reach out to potential candidates about new positions
- Real-time Voice Processing: Powered by Deepgram’s Voice Agent API
- MCP Integration: Seamless integration with Claude and other MCP-compatible AI assistants

- WebSocket-based Media Streaming: Real-time audio processing with Twilio Media Streams
- Dynamic Prompt Injection: Contextual AI prompts based on call purpose
- Function Call Handling: Advanced AI function calling for call management
- Comprehensive Logging: Detailed logging for debugging and monitoring
- Environment Configuration: Secure credential management

Before setting up the project, ensure you have:

1. Node.js (v22 or higher)
2. Twilio Account with:
- Account SID
- Auth Token
- Phone Number (for outbound calls)
3. Deepgram Account with API Key
4. Public URL (ngrok or production server) for webhooks

PORT=3000
SERVER_URL=your_ngrok_url_or_server_url

Verify Twilio configuration and service readiness.

```bash

1. Define the tool in src/mcp/tools.js
2. Add prompt generation logic in src/mcp/prompts.js
3. Implement tool handler in src/mcp/server.js

A powerful Model Context Protocol (MCP) server that integrates Twilio Voice, Deepgram AI, and OpenAI to create intelligent voice-based HR automation tools. This system enables AI assistants like Claude to conduct phone interviews, deliver notifications, and manage HR communications through natural voice conversations.

Demo video

https://github.com/user-attachments/assets/6c47a8b7-7428-4711-bf26-00d5951ec66f

Features

Core Capabilities

- AI-Powered Voice Interviews: Conduct professional phone interviews with candidates using AI
- Interview Result Notifications: Automatically call candidates with interview results and feedback
- Job Opportunity Outreach: Reach out to potential candidates about new positions
- Real-time Voice Processing: Powered by Deepgram’s Voice Agent API
- MCP Integration: Seamless integration with Claude and other MCP-compatible AI assistants

Technical Features

- WebSocket-based Media Streaming: Real-time audio processing with Twilio Media Streams
- Dynamic Prompt Injection: Contextual AI prompts based on call purpose
- Function Call Handling: Advanced AI function calling for call management
- Comprehensive Logging: Detailed logging for debugging and monitoring
- Environment Configuration: Secure credential management

Architecture

sequenceDiagram
    participant Claude as MCP Client(Claude App)
    participant MCP as MCP Server
    participant Twilio as Twilio Voice
    participant Deepgram as Deepgram
    participant AI as OpenAI

%% Step 1: Initiate interaction
Claude->>MCP: Initiate voice action (e.g., interview, notification)
MCP->>Twilio: Setup voice call
Twilio-->>MCP: Call status updates

%% Step 2: Real-time audio processing
Twilio->>Deepgram: Start audio stream
Deepgram-->>AI: Transcribed text
AI->>Deepgram: LLM response
Deepgram->>Twilio: Stream audio

Prerequisites

Before setting up the project, ensure you have:

1. Node.js (v22 or higher)
2. Twilio Account with:
- Account SID
- Auth Token
- Phone Number (for outbound calls)
3. Deepgram Account with API Key
4. Public URL (ngrok or production server) for webhooks

Installation

1. Clone the repository:

   git clone https://github.com/prakharbhardwaj/voice-agent-mcp-server.git
   cd voice-agent-mcp-server
   

2. Install dependencies:

   npm install
   

3. Environment Configuration:
Create a .env file in the root directory:

   # Server Configuration
   PORT=3000
   SERVER_URL=your_ngrok_url_or_server_url

# Twilio Credentials
TWILIO_ACCOUNT_SID=your_twilio_account_sid
TWILIO_AUTH_TOKEN=your_twilio_auth_token
TWILIO_PHONE_NUMBER=+your_twilio_phone_number

# Deepgram API Key
DEEPGRAM_API_KEY=your_deepgram_api_key

4. Configure MCP Server:
Update mcp-config.json with your actual paths and credentials:

   {
"mcpServers": {
"voice-agent-mcp-server": {
"type": "stdio",
"command": "node",
"args": ["/path/to/your/voice-agent-mcp-server/mcp-server.js"],
"env": {
"NODE_ENV": "production",
"SERVER_URL": "your_ngrok_url_or_server_url",
"TWILIO_ACCOUNT_SID": "your_twilio_account_sid",
"TWILIO_AUTH_TOKEN": "your_twilio_auth_token",
"TWILIO_PHONE_NUMBER": "+your_twilio_phone_number"
}
}
}
}

Usage

Start the Web Server

npm run dev

Using with Claude Desktop

1. Add the MCP server configuration to Claude Desktop's settings:
- For macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
- For Windows: %APPDATA%\Claude\claude_desktop_config.json
2. Restart Claude Desktop
3. Use the available tools in your conversation with Claude

Available MCP Tools

1. conduct_interview

Initiate a voice call to conduct a professional interview with a candidate.

Parameters:

- candidatePhone (string): Phone number in E.164 format
- candidateName (string): Name of the candidate
- position (string): Position they're applying for
- interviewQuestions (array): List of questions to ask

Example:

Conduct an interview with John Doe at +1234567890 for the Software Engineer position.
Ask about their experience with React, their problem-solving approach, and their career goals.
2. notify_interview_result

Call a candidate to inform them about their interview results.

Parameters:

- candidatePhone (string): Phone number in E.164 format
- candidateName (string): Name of the candidate
- position (string): Position they interviewed for
- result (enum): "accepted", "rejected", or "next_round"
- message (string): Additional feedback message

Example:

Call Jane Smith at +1234567890 to let her know she's been accepted for the Product Manager role.
3. discuss_job_opening

Reach out to potential candidates about job opportunities.

Parameters:

- candidatePhone (string): Phone number in E.164 format
- candidateName (string): Name of the potential candidate
- position (string): Job position to discuss
- companyInfo (string): Brief company and role information
- nextSteps (string): Next steps if interested

4. get_call_status

Get the status of active voice calls and system health.

5. check_twilio_config

Verify Twilio configuration and service readiness.

Project Structure

├── index.js                   # Main Fastify server
├── mcp-server.js              # MCP server implementation
├── mcp-config.json            # MCP configuration
├── package.json               # Dependencies and scripts
└── src/
    ├── SettingsConfiguration.js   # Deepgram agent settings
    ├── config/
    │   └── dotenv.js              # Environment configuration
    ├── mcp/
    │   ├── logger.js              # Logging utilities
    │   ├── prompts.js             # AI prompt generators
    │   ├── server.js              # MCP server logic
    │   └── tools.js               # MCP tool definitions
    ├── routes/
    │   └── twilioRoute.js         # Twilio webhook handlers
    ├── services/
    │   ├── functionCallHandler.js # AI function call processing
    │   └── twilioService.js       # Twilio API wrapper
    └── websockets/
        └── mediaStreamHandler.js  # WebSocket media processing

Configuration Details

Deepgram Agent Settings

The system uses Deepgram's Voice Agent with:

- Speech Recognition: Nova-3 model
- Text-to-Speech: Aura-2 Asteria voice
- LLM Integration: OpenAI GPT-4o-mini
- Audio Format: μ-law encoding at 8kHz (Twilio compatible)

Twilio Integration

- Media Streams: Real-time audio streaming via WebSocket
- TwiML: Dynamic call routing with custom parameters
- Call Management: Status tracking and call control

Troubleshooting

Common Issues

1. Twilio webhook not receiving calls:

- Ensure your SERVER_URL is publicly accessible
- Check ngrok is running and URL is updated
- Verify TwiML configuration

2. Deepgram connection issues:

- Validate DEEPGRAM_API_KEY
- Check WebSocket connectivity
- Review audio format compatibility

3. MCP server not loading in Claude:
- Verify mcp-config.json paths are absolute
- Check all environment variables are set
- Restart Claude Desktop after configuration changes

Debugging

Enable detailed logging by checking the console output and src/mcp/mcp-server.log file.

Development

Running in Development Mode

```bash

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.