Luna: Voice-Enabled Expense Management Agent

by rosiefaulkner

MCP Client 2 stars
  • agent-framework

Convert user audio messages into text and convert text responses from the agent back to audio (text-to-speech) to play to the user. The AI voice agent is an expense manager with access to an MCP server with tools that allow CRUD (create, read, update, delete) operations on a data

About

What is Luna: Voice-Enabled Expense Management Agent?

Luna is a voice-enabled AI assistant built with Langgraph that helps users manage expenses through natural conversation. It runs as a Python backend application on desktop and uses a microphone and speakers for voice interaction.

How to use Luna: Voice-Enabled Expense Management Agent?

Clone the repository, set up a Python 3.13 virtual environment with uv, install dependencies, then configure OPENAI_API_KEY and SUPABASE_URI in a .env file. Run python main.py, speak your request (e.g., “Create a new expense for lunch today that cost $15”), press Enter to stop recording, and hear Luna’s response. Say “exit” or “quit” to end the session.

Key features of Luna: Voice-Enabled Expense Management Agent

- Voice interaction with speech-to-text and text-to-speech
- Create, query, update, and delete expenses via natural conversation
- Automatic expense categorization based on descriptions
- PostgreSQL database integration through Supabase
- Tool-using agent built with Langgraph and MCP

Use cases of Luna: Voice-Enabled Expense Management Agent

- Quickly log a lunch or travel expense by speaking naturally
- Retrieve a list of recent expenses by asking “What did I spend last week?”
- Update or delete an expense after correcting a misstatement
- Automatically categorize expenses (e.g., food, transport) without manual entry

FAQ from Luna: Voice-Enabled Expense Management Agent

What does Luna do that other expense trackers don’t?

Luna is entirely voice-driven – you speak your expense and hear a response, making hands‑free management possible. It uses an AI agent (Langgraph) to understand complex requests and automatically categorises expenses.

What platforms and AI models does Luna use?

The backend runs on Python 3.13. It uses OpenAI’s Whisper API for speech-to-text, GPT-4 Mini for agent reasoning, and OpenAI TTS for text-to-speech. Audio capture uses the sounddevice library.

How does Luna support MCP (Model Context Protocol)?

Luna defines its database tools via MCP servers (configured in mcps/mcp_config.json). New tools can be added by creating a new MCP server and registering it in that configuration.

Can I customise Luna’s voice or personality?

Yes. You can change the TTS voice (e.g., “fable”), adjust speaking speed, and modify the system prompt in assistant_graph.py to alter Luna’s tone and capabilities.

What database does Luna use?

Luna stores expense data in a PostgreSQL database hosted on Supabase. Connection details are set in the SUPABASE_URI environment variable.

Details

Author
rosiefaulkner
GitHub stars
2
Category
agent-framework
Repository
rosiefaulkner/langgraph-voice-agent

Luna: Voice-Enabled Expense Management Agent

Luna is a voice-enabled AI assistant built with Langgraph that helps users manage their expenses through natural conversation. This project demonstrates how to create a voice interface for any Langgraph agent, combining speech-to-text and text-to-speech capabilities with a powerful agent framework.

🌟 Features

- Voice Interaction: Speak to Luna and hear responses through high-quality text-to-speech
- Expense Management: Create, query, update, and delete expenses through natural conversation
- Category Classification: Automatically categorizes expenses based on descriptions
- Database Integration: Stores expense data in a PostgreSQL database (via Supabase)
- Tool-using Agent: Built with Langgraph's agent framework for complex reasoning

🛠️ Technology Stack

Backend

- Python 3.13: Core language for the backend
- Langgraph: Agent framework for building the conversational AI
- OpenAI:
- Whisper API for speech-to-text
- GPT-4 Mini for the agent's reasoning
- TTS API for text-to-speech responses
- MCP (Model Calling Protocol): For defining and using tools
- SQLAlchemy: ORM for database interactions
- Supabase: PostgreSQL database provider

Audio Processing

- sounddevice: For capturing audio from microphone
- scipy: For audio file processing

📋 Prerequisites

- Python 3.13
- OpenAI API key
- Supabase account and database
- Microphone and speakers

🚀 Getting Started

1. Clone the repository

git clone https://github.com/rosiefaulkner/langgraph-voice-agent.git
cd langgraph-voice-agent

2. Set up a virtual environment and install dependencies

(Recommended) use uv for dependency management

Setup the venv in your project directory and install all dependencies with one command.

uv sync

3. Set up environment variables

Create a .env file in the root directory with the following variables:

OPENAI_API_KEY=your_openai_api_key
SUPABASE_URI=postgresql://postgres:password@db.example.supabase.co:5432/postgres

4. Run the application

python main.py

🎤 Using Luna

1. Run the application
2. When prompted, speak your request (e.g., "Create a new expense for lunch today that cost $15")
3. Press Enter to stop recording
4. Luna will process your request, interact with the database if needed, and respond verbally
5. Continue the conversation or say "exit" or "quit" to end the session

🧩 Project Structure

langgraph-voice-agent/
├── main.py                  # Main application entry point
├── assistant_graph.py       # Langgraph agent definition
├── state.py                 # State management for the agent
├── voice_utils.py           # Audio recording and playback utilities
├── mcps/                    # Model Calling Protocol servers
│   ├── mcp_config.json      # MCP server configuration
│   └── local_servers/
│       └── db.py            # Database tools implementation
├── .env                     # Environment variables (not in repo)
├── .env.example             # Example environment variables
└── pyproject.toml           # Project dependencies

🔧 Customizing the Agent

Modifying the System Prompt

To change Luna's personality or capabilities, edit the system_prompt in assistant_graph.py:

system_prompt = """You are Luna, the company's expense manager...

Adding New Tools

1. Create a new MCP server or add tools to the existing one in mcps/local_servers/
2. Register the server in mcps/mcp_config.json
3. The tools will be automatically available to the agent

Changing Voice Settings

Modify the TTS settings in voice_utils.py:

async def play_audio(message: str):
    # ...
    async with openai_async.audio.speech.with_streaming_response.create(
        model="gpt-4o-mini-tts",
        voice="fable",  # Change the voice here
        input=cleaned_message,
        instructions="Speak in a cheerful, helpful tone with a brisk pace.",  # Modify instructions
        response_format="pcm",
        speed=1.2,  # Adjust speed
    ) as response:
        # ...

📚 Resources

- Langgraph Documentation
- OpenAI API Documentation
- Model Context Protocol (MCP)
- SQLAlchemy Documentation

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.