Skip to main content
Glama

Voice Mode

by mbailey
index.html•24.8 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>VoiceMode MCP - Voice Mode for Claude Code</title> <meta name="description" content="VoiceMode MCP enables natural voice conversations with Claude Code and other AI coding assistants. Simple setup, powerful features."> <style> :root { /* Enhanced color palette */ --bg-primary: #0a0a0a; --bg-secondary: #141414; --bg-tertiary: #1a1a1a; --bg-code: #0d0d0d; --text-primary: #e8e8e8; --text-secondary: #999999; --text-tertiary: #666666; --accent: #00c896; --accent-hover: #00b082; --accent-muted: #00c89633; --accent-alt: #ff7979; --accent-alt-hover: #ff6b6b; --border: #2a2a2a; --border-subtle: #1f1f1f; /* Typography scale */ --text-xs: 0.75rem; --text-sm: 0.875rem; --text-base: 1rem; --text-lg: 1.333rem; --text-xl: 1.777rem; --text-2xl: 2.369rem; --text-3xl: 3.157rem; /* Spacing scale */ --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.5rem; --space-6: 2rem; --space-8: 3rem; /* Animation */ --transition-base: 250ms; --ease-out: cubic-bezier(0.16, 1, 0.3, 1); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', 'Roboto', 'Ubuntu', sans-serif; background-color: var(--bg-primary); color: var(--text-primary); font-size: var(--text-base); line-height: 1.7; letter-spacing: -0.011em; -webkit-font-smoothing: antialiased; min-height: 100vh; background-image: radial-gradient(circle at 10% 20%, rgba(0, 212, 170, 0.08) 0%, transparent 50%), radial-gradient(circle at 80% 80%, rgba(255, 107, 107, 0.08) 0%, transparent 50%); } /* Subtle background texture */ body::before { content: ''; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-image: repeating-linear-gradient( 0deg, transparent, transparent 2px, rgba(255, 255, 255, 0.01) 2px, rgba(255, 255, 255, 0.01) 4px ); pointer-events: none; z-index: 1; } .container { max-width: 800px; margin: 0 auto; padding: var(--space-6) var(--space-5); position: relative; z-index: 2; } header { text-align: center; padding: var(--space-8) 0; border-bottom: 1px solid var(--border); margin-bottom: var(--space-8); position: relative; } h1 { font-size: var(--text-3xl); font-weight: 300; letter-spacing: -0.03em; line-height: 1.1; margin-bottom: var(--space-3); color: var(--text-primary); position: relative; } .tagline { color: var(--text-secondary); font-size: var(--text-lg); margin-bottom: var(--space-5); font-family: 'Cascadia Code', 'SF Mono', monospace; } .github-cta { display: inline-flex; align-items: center; gap: var(--space-3); background-color: var(--bg-secondary); border: 2px solid var(--accent); border-radius: 8px; padding: var(--space-3) var(--space-5); color: var(--text-primary); text-decoration: none; font-weight: 500; transition: all var(--transition-base) var(--ease-out); position: relative; overflow: hidden; backdrop-filter: blur(10px); } .github-cta::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(0, 212, 170, 0.2), transparent); transition: left 0.5s; } .github-cta:hover::before { left: 100%; } .github-cta:hover { transform: translateY(-2px) scale(1.02); box-shadow: 0 4px 20px var(--accent-muted); border-color: var(--accent-hover); } .compatibility { background-color: var(--bg-secondary); border: 1px solid var(--border); border-radius: 8px; padding: var(--space-4); margin-bottom: var(--space-6); text-align: center; font-size: var(--text-sm); position: relative; overflow: hidden; } .compatibility::before { content: ''; position: absolute; top: -100%; left: -100%; width: 300%; height: 300%; background: linear-gradient( 45deg, transparent 48%, var(--accent-muted) 49%, var(--accent-muted) 51%, transparent 52% ); animation: scan 8s linear infinite; } @keyframes scan { 0% { transform: translate(-30%, -30%); } 100% { transform: translate(30%, 30%); } } .compatibility strong { color: var(--accent); font-weight: 600; } section { margin-bottom: var(--space-8); } .video-section { margin: var(--space-8) 0; } .video-container { position: relative; width: 100%; padding-bottom: 56.25%; /* 16:9 aspect ratio */ background-color: var(--bg-code); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; box-shadow: 0 0 40px var(--accent-muted); margin-top: var(--space-5); } .video-container::before { content: ''; position: absolute; top: -2px; left: -2px; right: -2px; bottom: -2px; background: linear-gradient(45deg, var(--accent), var(--accent-alt)); border-radius: 12px; opacity: 0.5; z-index: -1; animation: pulse 4s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 0.3; } 50% { opacity: 0.6; } } .video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 12px; } h2 { font-size: var(--text-xl); font-weight: 400; margin-bottom: var(--space-4); color: var(--accent); position: relative; } p { margin-bottom: var(--space-4); color: var(--text-secondary); line-height: 1.8; } .features { display: grid; gap: var(--space-5); margin-top: var(--space-6); } .feature { background-color: var(--bg-secondary); padding: var(--space-5); border-radius: 8px; border: 1px solid var(--border); transition: all var(--transition-base) var(--ease-out); position: relative; overflow: hidden; } .feature::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: linear-gradient(90deg, transparent, var(--accent), transparent); transform: translateX(-100%); transition: transform 0.5s; } .feature:hover::before { transform: translateX(0); } .feature h3 { font-size: var(--text-lg); margin-bottom: var(--space-2); color: var(--text-primary); font-weight: 500; } .feature p { font-size: var(--text-sm); margin-bottom: 0; line-height: 1.6; } .feature:hover { border-color: var(--accent); transform: translateX(4px); box-shadow: 0 0 20px var(--accent-muted); } .code-block { background-color: var(--bg-code); border: 1px solid var(--border); border-radius: 8px; padding: var(--space-5); margin: var(--space-5) 0; overflow-x: auto; font-family: 'Cascadia Code', 'SF Mono', 'Monaco', 'Inconsolata', monospace; font-size: var(--text-sm); line-height: 1.6; position: relative; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.3); } .code-block code { color: var(--text-primary); display: block; } .comment { color: var(--text-tertiary); font-style: italic; } .typing-indicator { display: inline-block; width: 2px; height: 1.2em; background: linear-gradient(var(--accent), transparent); animation: blink 1s infinite; vertical-align: text-bottom; margin-left: 2px; } @keyframes blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } .highlight-box { background-color: var(--bg-secondary); border: 1px solid var(--border); border-radius: 8px; padding: var(--space-5); margin: var(--space-6) 0; position: relative; } .highlight-box h3 { font-size: var(--text-lg); margin-bottom: var(--space-3); color: var(--text-primary); display: flex; align-items: center; gap: var(--space-2); } .highlight-box .label { background-color: var(--accent); color: var(--bg-primary); padding: 2px 8px; border-radius: 4px; font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; } .highlight-box p { margin-bottom: var(--space-3); } .highlight-box p a { color: var(--accent); text-decoration: none; border-bottom: 1px dotted var(--accent); transition: all var(--transition-base); } .highlight-box p a:hover { color: var(--accent-hover); border-bottom-style: solid; } .highlight-box .links { display: flex; gap: var(--space-4); flex-wrap: wrap; margin-top: var(--space-3); } .links { display: flex; gap: var(--space-6); margin-top: var(--space-6); flex-wrap: wrap; } .links a, .highlight-box a { color: var(--accent); text-decoration: none; display: inline-flex; align-items: center; gap: var(--space-2); transition: all var(--transition-base); position: relative; } .links a::after, .highlight-box a::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 0; height: 1px; background-color: var(--accent); transition: width var(--transition-base) var(--ease-out); } .links a:hover::after, .highlight-box a:hover::after { width: 100%; } .links a:hover, .highlight-box a:hover { color: var(--accent-hover); } .requirements { background-color: var(--bg-secondary); border: 1px solid var(--border); border-radius: 8px; padding: var(--space-5); margin: var(--space-6) 0; position: relative; } .requirements::before { content: 'SYSTEM REQUIREMENTS'; position: absolute; top: -10px; left: var(--space-4); background-color: var(--bg-secondary); padding: 0 var(--space-2); color: var(--accent); font-size: var(--text-xs); font-family: 'Cascadia Code', monospace; letter-spacing: 0.1em; } .requirements h3 { margin-bottom: var(--space-4); color: var(--text-primary); font-weight: 500; } .requirements ul { list-style: none; color: var(--text-secondary); } .requirements li { margin-bottom: var(--space-2); padding-left: var(--space-5); position: relative; } .requirements li::before { content: 'ā–ø'; position: absolute; left: var(--space-2); color: var(--accent); } footer { margin-top: var(--space-8); padding-top: var(--space-6); border-top: 1px solid var(--border); text-align: center; color: var(--text-secondary); font-size: var(--text-sm); } footer a { color: var(--accent); text-decoration: none; } footer a:hover { text-decoration: underline; } /* Focus styles */ a:focus, button:focus { outline: 2px solid var(--accent); outline-offset: 2px; } /* Reduced motion */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } @media (max-width: 600px) { h1 { font-size: var(--text-2xl); } .container { padding: var(--space-5) var(--space-4); } .links, .highlight-box .links { flex-direction: column; gap: var(--space-3); } .code-block { font-size: var(--text-xs); } } </style> </head> <body> <div class="container"> <header> <h1>VoiceMode MCP</h1> <p class="tagline">"Voice Mode for Claude Code (and other AI Coding Assistants)"</p> <a href="https://github.com/mbailey/voicemode" class="github-cta"> <svg width="20" height="20" viewBox="0 0 16 16" fill="currentColor"> <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/> </svg> View on GitHub </a> </header> <div class="compatibility"> <strong>Runs on:</strong> Linux • macOS • Windows (WSL) | <strong>Python:</strong> 3.10+ </div> <section> <h2>Overview</h2> <p> VoiceMode MCP brings natural voice conversations Claude Code and other AI coding assistants. Built on the Model Context Protocol (MCP), it provides a clean, reliable interface for adding voice capabilities to your AI workflows. </p> </section> <section class="video-section"> <h2>See It In Action</h2> <div class="video-container"> <iframe src="https://www.youtube.com/embed/cYdwOD_-dQc" title="VoiceMode MCP Demo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen> </iframe> </div> </section> <section> <h2>Quick Start<span class="typing-indicator"></span></h2> <div class="code-block"> <span class="comment"># Install VoiceMode MCP python package and dependencies</span><br> curl -LsSf https://astral.sh/uv/install.sh | sh<br> uvx voice-mode-install<br><br> <span class="comment"># Optional: Set OpenAI API key (backup if local services unavailable)</span><br> export OPENAI_API_KEY=your-openai-key<br><br> <span class="comment"># Add VoiceMode to Claude</span><br> claude mcp add --scope user voicemode -- uvx --refresh voice-mode<br><br> <span class="comment"># Start a voice conversation</span><br> claude converse </code> </div> <p style="margin-top: 1.5rem; color: var(--text-secondary);"> The voice-mode-install command automatically: </p> <ul style="list-style: none; color: var(--text-secondary); margin-left: 0;"> <li style="margin-bottom: 0.5rem; padding-left: 1.5rem; position: relative;"> <span style="position: absolute; left: 0; color: var(--accent);">āœ“</span> Checks and installs system dependencies (PortAudio, FFmpeg, gcc, etc.) </li> <li style="margin-bottom: 0.5rem; padding-left: 1.5rem; position: relative;"> <span style="position: absolute; left: 0; color: var(--accent);">āœ“</span> Installs VoiceMode MCP package via UV </li> <li style="margin-bottom: 0.5rem; padding-left: 1.5rem; position: relative;"> <span style="position: absolute; left: 0; color: var(--accent);">āœ“</span> Configures shell completions for the voicemode CLI </li> <li style="margin-bottom: 0.5rem; padding-left: 1.5rem; position: relative;"> <span style="position: absolute; left: 0; color: var(--accent);">āœ“</span> Sets up optional local STT/TTS services (Whisper, Kokoro) </li> <li style="margin-bottom: 0.5rem; padding-left: 1.5rem; position: relative;"> <span style="position: absolute; left: 0; color: var(--accent);">āœ“</span> Validates the installation and provides next steps </li> </ul> <p style="margin-top: 1.5rem; color: var(--text-secondary);"> For manual setup or detailed instructions, see the <a href="https://github.com/mbailey/voicemode/blob/main/docs/tutorials/getting-started.md" style="color: var(--accent); text-decoration: none; border-bottom: 1px dotted var(--accent);">Getting Started Guide</a>. </p> </section> <div class="highlight-box"> <h3> <span class="label">Optional</span> Self-Hosted Voice Services </h3> <p> For complete privacy, run speech recognition and text-to-speech locally instead of using OpenAI. Both <a href="https://github.com/ggerganov/whisper.cpp">whisper.cpp</a> and <a href="https://github.com/remsky/Kokoro-FastAPI">Kokoro-FastAPI</a> provide OpenAI-compatible APIs for seamless integration. </p> <div class="code-block" style="margin-top: 1rem;"> <span class="comment"># Install local speech-to-text (Whisper)</span><br> voicemode whisper install<br><br> <span class="comment"># Install local text-to-speech (Kokoro)</span><br> voicemode kokoro install </div> </div> <section> <h2>Features</h2> <div class="features"> <div class="feature"> <h3>Voice Conversations</h3> <p>Natural voice interactions with Claude through your microphone and speakers, airpods, etc</p> </div> <div class="feature"> <h3>OpenAI Compatible</h3> <p>Works with OpenAI's API and compatible services for speech processing</p> </div> <div class="feature"> <h3>Simple Integration</h3> <p>Clean MCP protocol implementation that works seamlessly with Claude Desktop</p> </div> </div> </section> <section> <div class="requirements"> <h3>Requirements</h3> <ul> <li>OpenAI API key (or self-hosted STT & TTS services)</li> <li>Microphone and speakers for voice I/O</li> <li>Python 3.8+ (handled by uvx)</li> </ul> </div> </section> <section> <h2>Resources</h2> <div class="links"> <a href="https://github.com/mbailey/voicemode"> <svg width="20" height="20" viewBox="0 0 16 16" fill="currentColor"> <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/> </svg> GitHub Repository </a> <a href="https://pypi.org/project/voice-mode/"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/> <polyline points="3.27 6.96 12 12.01 20.73 6.96"/> <line x1="12" y1="22.08" x2="12" y2="12"/> </svg> PyPI Package </a> <a href="https://github.com/mbailey/voicemode/issues"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> <circle cx="12" cy="12" r="10"/> <line x1="12" y1="8" x2="12" y2="12"/> <line x1="12" y1="16" x2="12.01" y2="16"/> </svg> Report Issues </a> </div> </section> <footer> <p> <a href="https://getvoicemode.com">getvoicemode.com</a> &middot; A <a href="https://failmode.com">Failmode</a> Project &middot; MIT Licensed </p> </footer> </div> <!-- Goatcounter Analytics - Privacy-respecting, no cookies --> <script data-goatcounter="https://getvoicemode.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script> <noscript> <img src="https://getvoicemode.goatcounter.com/count?p=/"> </noscript> </body> </html>

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/mbailey/voicemode'

If you have feedback or need assistance with the MCP directory API, please join our Discord server