# Carbon Voice MCP MCP Server > **Carbon Voice MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to Carbon Voice MCP. > > MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows, > token refresh, and production-grade auto-scaling — so your AI agents can connect to > third-party services and run freely without you managing any MCP server yourself. > > Server page: https://mewcp.com/mcp/carbonvoice-mcp > MewCP docs: https://docs.mewcp.com > Full catalog: https://mewcp.com/llms.txt --- ## About Connect AI assistants to Carbon Voice for asynchronous voice and text communication. Create, send, search, and retrieve voice messages, access transcriptions, manage conversations and folders, and use AI actions to summarize discussions and extract action items. --- ## Details - Server ID: `carbonvoice-mcp` - Version: 2.12.0 - Tools: 42 - Authentication: OAuth, managed by MewCP - Transport: http --- ## Access The gateway URL below serves your **entire MewCP toolset**, not this server on its own. Pasting a config snippet is not enough — Carbon Voice MCP has to be in the toolset first. In order: 1. Add Carbon Voice MCP to your toolset at https://mewcp.com/mcp/carbonvoice-mcp 2. Connect your Carbon Voice MCP account (OAuth); MewCP stores the credential and attaches it to each call 3. Copy your MewCP API key from the dashboard (Developer) 4. Configure your client with the snippet for it below Once connected, an agent does **not** see this server's tools as top-level tools. It sees four meta-tools and reaches everything through them: - `search(query)` — find tools by keyword across the toolset - `get_schema(tools)` — full description and arguments for the tools you picked - `list_accounts(provider)` — only when one app has several connected accounts - `call_tool(server_maskedId, tool_name, args)` — execute So the list below is what `search` can return for this server, not a set of callable tool names on their own. --- ## Tools (42) Descriptions are truncated to 160 characters; call `get_schema` for the full text and the argument schema. Where a tool is annotated, its type is shown — treat `destructive` as irreversible. - `list_messages` _(read)_ — List messages with filtering by date, conversation, folder, workspace, creator or language. USE WHEN: The general-purpose message reader; full bodies incl.… - `get_message` _(read)_ — Get one message by ID, optionally expanded with related records. USE WHEN: You have a message ID. `fields` ADDS related data (`conversation`, `creator`,… - `get_recent_messages` _(read)_ — Get up to 10 of the most recent messages, each with its conversation, creator and labels. USE WHEN: A quick "what just happened" glance. Pre-joined, so no… - `create_conversation_message` _(write)_ — Post a message into an existing conversation, or reply in a thread. USE WHEN: You have a `conversation_id`. Pass `parent_id` (a message ID) to reply as a… - `create_direct_message` _(write)_ — Send a direct message to one or more people, by user ID or email. USE WHEN: Reaching people outside an existing conversation. Address it with `to.user_ids` or… - `create_voicememo_message` _(write)_ — Create a voice memo, either from text (spoken via text-to-speech) or from an audio file at a URL. USE WHEN: Pass `transcript` (2-5000 chars) to have Carbon… - `add_attachments_to_message` _(write)_ — Attach one or more link URLs to an existing message. USE WHEN: Adding external links to a message that already exists. USE INSTEAD: `create_message_share_link`… - `get_user` _(read)_ — Get a user's full profile by ID — names, languages, voice settings, workspace roles. USE WHEN: You already have a user ID and need complete details. USE… - `search_user` _(read)_ — Find a single user by email, phone or name. USE WHEN: Resolving ONE person. Supply exactly one of `email`, `phone` or `name`. Name search only matches your own… - `search_users` _(read)_ — Resolve several users at once by emails, phones, IDs or names. USE WHEN: Turning a list of people into user IDs in one call — the right first step before any… - `get_current_user` _(read)_ — Get the calling user's own identity, workspaces and settings. USE WHEN: Establishing who you are acting as, or finding the caller’s workspace IDs before a… - `list_conversations` _(read)_ — List your conversations from the last 6 months, optionally filtered by participants, type and name. USE WHEN: Finding a `conversation_id`. Filter with… - `get_conversation` _(read)_ — Get one conversation by ID, with full metadata. USE WHEN: You have a `conversation_id` and need its description, visibility, owner or workspace name. USE… - `get_conversation_users` _(read)_ — List the people in a conversation. USE WHEN: Finding out who is in a conversation, or collecting participant user IDs. USE INSTEAD: `search_users` to resolve… - `summarize_conversation` _(write)_ — Summarize a conversation by running an AI Action over its recent messages. USE WHEN: You want a conversation summarized and have a `conversation_id`. Message… - `get_root_folders` _(read)_ — List the root folders of a workspace for a given folder type. USE WHEN: Orienting in the folder tree, or finding a `folder_id`. `type` is required: `voicememo`… - `create_folder` _(write)_ — Create a folder in a workspace, optionally nested under another. USE WHEN: Organising memos. `name`, `type` and `workspace_id` are all required; add… - `get_folder` _(read)_ — Get one folder's metadata and, optionally, its immediate subfolders. USE WHEN: Inspecting a folder. Set `include_first_level_tree: true` to get subfolders.… - `get_folder_with_messages` _(read)_ — Get a folder together with the messages stored directly in it. USE WHEN: Reading a folder’s contents. Only messages at that folder’s own level are returned —… - `update_folder_name` _(destructive)_ — Rename a folder. USE WHEN: Changing only the name. `name` is the sole editable field here. USE INSTEAD: `move_folder` to change where a folder sits in the… - `delete_folder` _(destructive)_ — Permanently delete a folder, including every nested folder and all their messages. USE WHEN: Only when the whole subtree should be destroyed. This cascades and… - `move_folder` _(destructive)_ — Move a folder into another folder, or up to a workspace root. USE WHEN: Relocating a folder. Pass `folder_id` for a new parent folder, or `workspace_id` to… - `move_message_to_folder` _(destructive)_ — Move a message into a folder, or out to a workspace. USE WHEN: Filing a memo. Only `voicememo`/`prerecorded` messages you created can be moved, and the message… - `get_workspaces_basic_info` _(read)_ — List every workspace you belong to, as id and name only. USE WHEN: The cheapest way to resolve a workspace name to an ID before a workspace-scoped call. Takes… - `list_ai_actions` _(read)_ — List the AI Actions (Prompts) available to you — each has an `id` usable as `prompt_id`. USE WHEN: Before calling `run_ai_action` or `summarize_conversation`,… - `run_ai_action` _(write)_ — Run an AI Action (Prompt) against one or more specific messages. USE WHEN: You have concrete `message_ids` and a `prompt_id`, and want the AI Action applied to… - `run_ai_action_for_shared_link` _(write)_ — Run an AI Action (Prompt) against one or more shared messages, addressed by share link ID. USE WHEN: You have share link IDs — from… - `get_ai_action_responses` _(read)_ — Retrieve AI Action results that were generated previously. USE WHEN: You want existing output rather than a fresh run — e.g. showing what an AI Action already… - `create_message_share_link` _(write)_ — Create a shareable link to an existing message (e.g. a voice memo), and get the URL back. USE WHEN: `share_type: "link"` for a shareable URL; `"forward"` to… - `get_message_share_link` _(read)_ — Look up an existing message share link by its ID, including the message behind it. USE WHEN: You have a share link ID and want its URL, access settings, or… - `list_my_action_items` _(read)_ — List your action items across every conversation and folder: those assigned to you, PLUS unassigned ones you created. USE WHEN: Answering "what do I owe / what… - `list_action_items` _(read)_ — List action items belonging to one container — a conversation, a folder, or home. USE WHEN: You have a `container_id` and want its action items.… - `get_action_item` _(read)_ — Get one action item by its ID, with full detail. USE WHEN: You have an action item ID and need its notes, assignee, due date, or source message. USE INSTEAD:… - `create_action_item` _(write)_ — Create an action item, optionally attached to a conversation or folder. USE WHEN: Recording a task. Only `title` is required. Attach it by passing both… - `update_action_item` _(destructive)_ — Change an action item's title, notes, assignee, or due date. USE WHEN: Editing item content. Send only the fields you want changed — omitted fields are left as… - `set_action_item_status` _(destructive)_ — Move an action item between `suggested`, `todo` and `done`. USE WHEN: Completing an item (`done`), reopening it (`todo`), or accepting an AI-suggested item by… - `delete_action_item` _(destructive)_ — Permanently delete an action item. USE WHEN: The item was created in error and should not exist at all. USE INSTEAD: `set_action_item_status` with `done` to… - `suggest_action_items_from_message` _(write)_ — Extract action items from ONE message and return them immediately. USE WHEN: Turning a single message into tasks — "what did she ask me to do?". The items come… - `suggest_action_items_from_messages` _(write)_ — Queue AI extraction of candidate action items from specific messages. Runs in the background. USE WHEN: Turning a conversation into tasks — "what did we agree… - `search_message_ids` _(read)_ — Find message IDs by notified state, mentions, labels, creator, conversation or workspace — returning IDs plus cursor metadata. USE WHEN: Any filter… - `search_messages_by_heard_status` _(read)_ — Find messages by whether you have listened to them, and get per-conversation unheard counts. USE WHEN: "What have I not listened to yet" / "catch me up".… - `list_inbox_notifications` _(read)_ — List your inbox notifications, with a total unread count. USE WHEN: Answering "what did I miss" or "where was I mentioned" — pass `category: "mentions"` for… --- ## Connect Gateway URL: https://gateway.mewcp.com/personal/mcp Every request carries one header: Authorization: Bearer Replace `API_KEY` with your own key from the dashboard (Developer). ## Apps ### Claude Desktop Mac & Windows app - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json` - Windows: `%APPDATA%\Claude\claude_desktop_config.json` ```json { "mcpServers": { "mewcp": { "command": "npx", "args": [ "-y", "mcp-remote@latest", "https://gateway.mewcp.com/personal/mcp", "--header", "Authorization: Bearer API_KEY" ] } } } ``` Already have an "mcpServers" section in your config? Just add the server entry inside it. 1. Open Claude Desktop → Settings → Developer → "Edit Config" 2. Paste the snippet inside the outer { } of the config file (merge with your existing "mcpServers" section if you have one) 3. Save the file and restart Claude Desktop 4. Start a new conversation — your tool will be available ### VS Code Copilot / Cline - Command Palette → "MCP: Open User Configuration" (opens mcp.json). For one project only, use .vscode/mcp.json instead. ```json { "mcp.servers": { "mewcp": { "type": "http", "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have a "servers" section in your mcp.json? Just add the server entry inside it. 1. Open VS Code → Command Palette (Cmd+Shift+P / Ctrl+Shift+P) 2. Run "MCP: Open User Configuration" to open your mcp.json 3. Paste the snippet and save 4. Start the server when prompted (or from the MCP servers view) and use it in Copilot Chat ### Cursor AI-first editor - macOS: `~/.cursor/mcp.json` - Windows: `%USERPROFILE%\.cursor\mcp.json` ```json { "mcpServers": { "mewcp": { "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcpServers" section in your mcp.json? Just add the server entry inside it. 1. Open Cursor → Settings → Cursor Settings → MCP 2. Click "Add new global MCP server" 3. Paste the snippet and save 4. Restart Cursor ### Codex OpenAI's CLI agent - Add the snippet to your Codex MCP config or your standard MCP config file for the CLI tool you use. ```json { "mcpServers": { "mewcp": { "type": "http", "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Codex generally reads a standard MCP server block, so you can add this alongside your other configured servers. 1. Open your Codex MCP config or project-level config file 2. Paste the MewCP server block inside the config JSON/TOML structure your tool expects 3. Save the file and restart Codex 4. Verify the tool is available inside a fresh session ### Claude Code Anthropic's CLI agent - ~/.claude.json (user scope) or .mcp.json in your project root — create it if it doesn't exist. Or skip the file and use the CLI command below. ```json { "mcpServers": { "mewcp": { "type": "http", "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcpServers" section in your config? Just add the server entry inside it. 1. Open ~/.claude.json (or .mcp.json in your project root) in a text editor 2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one) 3. Save the file and start (or restart) Claude Code 4. Or skip the file entirely and run the CLI command below instead ### OpenCode Open-source terminal agent - ~/.config/opencode/opencode.json (global) or opencode.json in your project root — create it if it doesn't exist. ```json { "$schema": "https://opencode.ai/config.json", "mcp": { "mewcp": { "type": "remote", "url": "https://gateway.mewcp.com/personal/mcp", "enabled": true, "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcp" section in your opencode.json? Just add the server entry inside it. 1. Open ~/.config/opencode/opencode.json (or opencode.json in your project root) in a text editor 2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one) 3. Save the file and start (or restart) OpenCode ### OpenClaw Self-hosted agent gateway - ~/.openclaw/openclaw.json — create it if it doesn't exist. ```json { "mcp": { "servers": { "mewcp": { "transport": "streamable-http", "url": "https://gateway.mewcp.com/personal/mcp", "enabled": true, "headers": { "Authorization": "Bearer API_KEY" } } } } } ``` Already have an "mcp" section in your openclaw.json? Just add the server entry inside "servers". 1. Open ~/.openclaw/openclaw.json in a text editor 2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one) 3. Save the file and restart OpenClaw ### Antigravity Google's agentic IDE - ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — create it if it doesn't exist. ```json { "mcpServers": { "mewcp": { "serverUrl": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcpServers" section in your config? Just add the server entry inside it. Remote servers must use the "serverUrl" field — the legacy "url"/"httpUrl" fields aren't supported. 1. In the editor's agent side panel, click "…" → "MCP Servers" → "Manage MCP Servers" → "View raw config" (Antigravity CLI: type /mcp instead to open the Interactive MCP Manager) 2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one) 3. Save the file — the server connects automatically ### Hermes Nous Research's CLI agent - config.yaml in your Hermes config directory (~/.hermes) — add this under a top-level "mcp_servers:" key. ```yaml mcp_servers: mewcp: url: "https://gateway.mewcp.com/personal/mcp" headers: Authorization: "Bearer API_KEY" ``` Already have an "mcp_servers" section in your config.yaml? Just add the server entry inside it. 1. Open config.yaml in your Hermes config directory 2. Paste the snippet under the top-level "mcp_servers:" key (merge with existing entries if you have any) 3. Save the file, then run /reload-mcp in Hermes (or start a fresh session) 4. Ask Hermes "Tell me which MCP-backed tools are available right now" to confirm it connected ### DeepSeek Harness DeepSeek's agent harness - cordis.yml in your DSH project — or the patch file you mount plugins from. ```yaml - id: mcp-mewcp name: '@deepseek-ai/dsh-mcp-client' config: serverName: mewcp transport: streamable-http url: https://gateway.mewcp.com/personal/mcp headers: Authorization: "Bearer API_KEY" ``` One plugin instance = one MCP server. Add this entry to your plugin list; don't nest it inside another entry. 1. Open cordis.yml (or your patch file) in your DSH project 2. Paste the entry into your plugin list, keeping the leading dash and indentation 3. Restart DSH (or let HMR reload) — tools register as mcp__mewcp__ 4. Verify with: dsh web --dump-config | grep -A3 mcp ## SDKs ### Python fastmcp client ```python import asyncio from fastmcp import Client from fastmcp.client.transports import StreamableHttpTransport SERVER_URL = "https://gateway.mewcp.com/personal/mcp" API_KEY = "API_KEY" transport = StreamableHttpTransport( url=SERVER_URL, headers={ "Authorization": f"Bearer {API_KEY}", } ) async def main(): client = Client(transport) async with client: tools = await client.list_tools() print(tools) asyncio.run(main()) ``` 1. Install fastmcp: pip install fastmcp 2. Copy the snippet into your project 3. Replace API_KEY with your key from the dashboard 4. Run your script ### TypeScript MCP SDK ```typescript import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; const SERVER_URL = "https://gateway.mewcp.com/personal/mcp"; const API_KEY = "API_KEY"; const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), { requestInit: { headers: { Authorization: `Bearer ${API_KEY}`, }, }, }); const client = new Client({ name: "mewcp-client", version: "1.0.0" }); await client.connect(transport); const tools = await client.listTools(); console.log(tools.tools.map((t) => t.name)); ``` 1. Install: npm install @modelcontextprotocol/sdk 2. Copy the snippet into your project 3. Replace API_KEY with your key from the dashboard 4. Run with Node 18+ as an ES module (e.g. npx tsx script.ts)