Custom stdio MCP server for the Omi AI wearable platform. 38 tools, dual auth (Dev API + Firebase), zero dependencies.
Omi MCP Server
A custom MCP (Model Context Protocol) server that connects Claude to the full Omi platform - 38 tools covering memories, conversations, action items, goals, transcript editing, speaker management, and more.
Why This Exists
Omi provides an official MCP server using SSE (Server-Sent Events) transport. Two problems:
-
Firewall issues on managed devices. SSE maintains persistent long-lived HTTP connections. On Windows, this triggers "Allow Node.js through Windows Firewall?" prompts. On a work-managed device, that's a non-starter.
-
No Internal API access. The official MCP only uses the Developer API key. It can't edit transcript text, assign speakers to segments, query conversations by status, reprocess conversations, or manage apps/templates - all of which require Firebase authentication.
This server solves both:
- stdio transport - standard outbound HTTPS requests only, no persistent connections, no firewall prompts
- Dual authentication - Developer API key for standard CRUD + Firebase tokens for Internal API access, on a single server
Prerequisites
- Node.js 24+ (uses built-in
fetch()- zero npm dependencies) - Omi account with the Omi mobile app installed
- Claude Code or Claude Desktop (any MCP-compatible client works)
Setup
1. Get Your Credentials
You need three values:
Developer API Key
- Open the Omi mobile app
- Go to Settings > Developer
- Tap "Create Key"
- Copy the key (shown once, starts with
omi_dev_)
Keys are case-sensitive - it's omi_dev_ lowercase, not Omi_dev_.
Firebase Refresh Token
This gives access to Omi's Internal API (transcript editing, speaker assignment, conversation lifecycle). If you only need the Developer API tools, you can skip this.
- Open omi.me in Chrome and log in
- Open DevTools (F12)
- Go to the Application tab
- In the left sidebar, expand IndexedDB
- Find firebaseLocalStorageDb
- Click into the object store
- Find the entry with your user data
- Navigate to:
value>stsTokenManager>refreshToken - Copy the refresh token string
The refresh token doesn't expire unless you change your password or explicitly revoke sessions. You only need to do this once.
Firebase API Key
This identifies Omi's Firebase project. It's not a secret (it's embedded in the web app), but you need the correct one to avoid PROJECT_NUMBER_MISMATCH errors.
Important: Omi has two Firebase projects. The key in the GitHub repo (AIzaSyC1U6S-...) is the dev project. Production users need the production key. Check the Omi web app's network requests or source to find the current production key.
2. Register the Server
Claude Code (CLI)
claude mcp add --scope user omi \
node /path/to/omi-mcp-server.js \
-e OMI_DEV_API_KEY=omi_dev_your_key \
-e OMI_FIREBASE_API_KEY=your_firebase_api_key \
-e OMI_FIREBASE_REFRESH_TOKEN=your_refresh_token
Replace /path/to/ with the actual path to omi-mcp-server.js.
Claude Desktop
Add to your config file (%APPDATA%\Claude\claude_desktop_config.json on Windows, ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"omi": {
"command": "node",
"args": ["/path/to/omi-mcp-server.js"],
"env": {
"OMI_DEV_API_KEY": "omi_dev_your_key",
"OMI_FIREBASE_API_KEY": "your_firebase_api_key",
"OMI_FIREBASE_REFRESH_TOKEN": "your_refresh_token"
}
}
}
}
3. Verify
After registration, your MCP client should list all 38 tools. Try a simple read operation:
Get my latest 5 Omi memories
Tool Reference
Developer API Tools (API Key Auth)
These tools use your OMI_DEV_API_KEY for authentication.
Memories (5 tools)
| Tool | Description |
|------|-------------|
| get_memories | List memories with pagination and category filter |
| create_memory | Create a single memory (fact, insight, note) |
| create_memories_batch | Create up to 25 memories at once |
| update_memory | Update content, visibility, tags, or category |
| delete_memory | Permanently delete a memory |
Conversations (6 tools)
| Tool | Description |
|------|-------------|
| get_conversations | List completed conversations with filters |
| get_conversation | Get a single conversation by ID (with optional transcript) |
| create_conversation | Create from plain text (runs full processing pipeline) |
| create_conversation_from_segments | Create from structured transcript segments with speaker/timing data |
| update_conversation | Update title or discard status |
| delete_conversation | Permanently delete a conversation |
Action Items (5 tools)
| Tool | Description |
|------|-------------|
| get_action_items | List action items with status/date/conversation filters |
| create_action_item | Create a standalone action item |
| create_action_items_batch | Create up to 50 action items at once |
| update_action_item | Update description, completion status, or due date |
| delete_action_item | Permanently delete an action item |
Goals (6 tools)
| Tool | Description |
|------|-------------|
| get_goals | List active goals (boolean, scale, or numeric types) |
| create_goal | Create a new goal (max 3 active) |
| update_goal | Update title, values, or unit |
| update_goal_progress | Quick progress value update |
| get_goal_history | Get progress history over time (up to 365 days) |
| delete_goal | Delete a goal |
Internal API Tools (Firebase Auth)
These tools use Firebase ID tokens. They require OMI_FIREBASE_API_KEY and OMI_FIREBASE_REFRESH_TOKEN.
Conversation Lifecycle (3 tools)
| Tool | Description |
|------|-------------|
| get_conversations_by_status | List conversations by status: in_progress, processing, merging, completed, failed |
| process_in_progress_conversation | Force-process a stuck in_progress conversation |
| reprocess_conversation | Regenerate title/overview/action items from transcript |
Search & Merge (2 tools)
| Tool | Description |
|------|-------------|
| search_conversations | Full-text search across all conversations |
| merge_conversations | Combine fragmented recordings into one conversation |
Transcript Editing (2 tools)
| Tool | Description |
|------|-------------|
| edit_segment_text | Fix transcription errors in a specific segment |
| assign_segments | Bulk assign speaker identity (is_user or person_id) |
App/Template Management (5 tools)
| Tool | Description |
|------|-------------|
| get_enabled_apps | List installed apps/templates |
| get_app_details | Get full app details by ID |
| enable_app | Install an app/template |
| disable_app | Disable without deleting |
| delete_app | Permanently delete (user-owned only) |
People/Speaker Profiles (4 tools)
| Tool | Description |
|------|-------------|
| get_people | List all speaker profiles with speech samples |
| create_person | Create a new speaker profile |
| update_person_name | Rename a speaker profile |
| delete_person | Delete profile and all speech samples |
Troubleshooting
"Allow Node.js through Windows Firewall?" prompt
You're using the SSE-based official server, not this one. This stdio server makes standard outbound HTTPS requests only - no firewall prompts.
PROJECT_NUMBER_MISMATCH error
You're using the wrong Firebase API key. Omi has two Firebase projects (dev and production). Make sure your OMI_FIREBASE_API_KEY matches the Firebase project your account is on. If your account is on production omi.me, you need the production key - not the dev key from the GitHub repo.
API key not working / 401 errors
- Dev API keys are case-sensitive:
omi_dev_(lowercase), notOmi_dev_ - Check that the key is correctly set in your environment variables
- Verify the key hasn't been revoked in the Omi mobile app
assign_segments returns 404
The endpoint URL format matters. This server uses the Internal API path (/v1/conversations/{id}/segments/assign), not the Developer API path (/v1/dev/user/conversations/{id}/segments/assign). If you've modified the code, verify the path.
Firebase token refresh fails
Your refresh token may have been revoked (password change, session revocation). Re-extract it from omi.me browser IndexedDB following the setup steps above.
Conversations stuck in "processing" status
Use get_conversations_by_status to find them, then process_in_progress_conversation or reprocess_conversation to push them through. This commonly happens after Bluetooth disconnects or app crashes.
Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| OMI_DEV_API_KEY | Yes | Omi Developer API key (omi_dev_xxx) |
| OMI_FIREBASE_API_KEY | For Internal API tools | Firebase project API key |
| OMI_FIREBASE_REFRESH_TOKEN | For Internal API tools | Firebase refresh token from browser |
| OMI_API_BASE_URL | No | Override API base URL (default: https://api.omi.me) |
License
MIT - see LICENSE.