CosVoice

A real phone number and email for your AI Chief of Staff. Calls, bookings by phone, summaries.

Should I use this

Quality & Safety

B
Description quality
89%
Schema completeness
71%
Naming quality
96%
Poisoning risk
80%
Permission match
90%
Protocol compliance
100%

Findings (8)

  • HIGHTool poisoning patterns detected
  • LOWTool 'get_account' description lacks action verbin get_account
  • LOWTool 'list_reservations' description lacks action verbin list_reservations
  • LOWTool 'list_messages' description lacks action verbin list_messages
  • LOWTool 'get_settings' description lacks action verbin get_settings
  • LOWTool 'list_integrations' description lacks action verbin list_integrations
  • LOWTool description contains role marker that could confuse chat modelsin place_call
  • LOWTool 'set_webhook' suggests web access but openWorldHint=falsein set_webhook

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,490Tokens (tool definitions)
~1.1 KBTypical response size
Significant attention impact (3.51% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "cosvoice": {
      "url": "https://cosvoice.com/mcp"
    }
  }
}

Remote endpoints

https://cosvoice.com/mcpstreamable-http

What it can do

Tool inventory

Tools (27)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟒get_account

Who this key belongs to and whether a line exists yet.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟒search_numbers(area_code, country)

Find available phone numbers in a US area code for a new line.

Input Schema

{
  "type": "object",
  "properties": {
    "area_code": {
      "type": "string",
      "pattern": "^[2-9][0-9]{2}$"
    },
    "country": {
      "type": "string",
      "enum": [
        "US",
        "CA"
      ]
    }
  },
  "required": [
    "area_code"
  ],
  "additionalProperties": false
}
πŸ”΄create_line(name, handle, phone_number, area_code, owner_name, ...)

Set up the phone line: claim a number (pick one from search_numbers or just give an area code), name the persona, and register the owner's mobile. An account can own several lines; each needs its own paid plan (if none is waiting, this returns a checkout link). Ask the owner before opting them in to texts.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Persona name, e.g. 'Lloyd'."
    },
    "handle": {
      "type": "string",
      "description": "Short handle for [email protected]. Defaults from name."
    },
    "phone_number": {
      "type": "string",
      "description": "E.164 from search_numbers."
    },
    "area_code": {
      "type": "string"
    },
    "owner_name": {
      "type": "string"
    },
    "owner_phone": {
      "type": "string",
      "description": "Owner's mobile. Calls/texts from it are treated as instructions."
    },
    "timezone": {
      "type": "string",
      "default": "America/Los_Angeles"
    },
    "voice": {
      "type": "string",
      "enum": [
        "eve",
        "ara",
        "rex",
        "sal",
        "carina",
        "celeste",
        "rigel",
        "luna",
        "lux",
        "atlas",
        "leo",
        "iris",
        "ursa",
        "lumen",
        "castor",
        "naksh",
        "perseus",
        "zenith",
        "helios",
        "kepler",
        "cosmo",
        "altair",
        "orion",
        "zagan",
        "helix",
        "sirius"
      ]
    },
    "notify_email": {
      "type": "string"
    },
    "agent_email": {
      "type": "string",
      "description": "An inbox your agent reads (e.g. an AgentMail address). Owner instructions are emailed there instantly, with an hourly digest of anything unacknowledged, plus every call debrief."
    },
    "plan": {
      "type": "string",
      "enum": [
        "starter",
        "plus",
        "pro"
      ],
      "default": "starter",
      "description": "starter $29/100 min Β· plus $79/300 min Β· pro $199/1000 min; overage $0.25/min."
    },
    "founding": {
      "type": "boolean",
      "description": "No longer offered. Ignored."
    },
    "sms_opt_in": {
      "type": "boolean",
      "description": "Owner agreed to receive texts from the line (delivery starts once carrier registration is complete)."
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false
}
🟒get_line

Number, email identity, persona, owner, and minutes remaining this period.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
πŸ”΄place_call(to, purpose, callee_name, desired_resolution, slots, ...)

Have the line call a real number and hold a live voice conversation on the owner's behalf. Brief it like a human assistant: who to ask for, what you want, acceptable fallbacks, what to do on voicemail. Set connect_owner when the owner wants to be put through once a human is reached (the line waits on hold, then rings the owner). Asynchronous: poll get_call or wait for the call.completed webhook.

Input Schema

{
  "type": "object",
  "properties": {
    "to": {
      "type": "string"
    },
    "purpose": {
      "type": "string",
      "maxLength": 1200,
      "description": "The job in plain English, with fallbacks and what to do on voicemail. Up to 1,200 characters; a longer purpose is refused with an error, never trimmed."
    },
    "callee_name": {
      "type": "string"
    },
    "desired_resolution": {
      "type": "string"
    },
    "slots": {
      "type": "object",
      "additionalProperties": true
    },
    "paths": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "max_minutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "description": "No call runs longer than 10 minutes."
    },
    "connect_owner": {
      "type": "boolean",
      "description": "Hold-and-bridge. The line works the phone menu and waits on hold; when a person who can help is on the line it says 'one moment' and rings the owner's mobile, joining the two. The line drops off. Use when the owner wants to talk themselves but not wait. Needs owner_phone on the line."
    }
  },
  "required": [
    "to",
    "purpose"
  ],
  "additionalProperties": false
}
πŸ”΄book_reservation(venue_name, venue_phone, party_size, date, time, ...)

Reserve a table by phone: the line calls the venue, negotiates the time, answers the host's questions (name, callback, email), records policies, and never pays. Give the venue's phone number, party size, date/time, and the acceptable window or fallbacks. Returns reservation_id and call_id; read the outcome with get_call or list_reservations before telling the owner anything is confirmed. Statuses: confirmed, alternative_confirmed, waitlisted, hold, requires_online, needs_owner, callback_later, no_availability, declined_by_venue, voicemail, not_reached.

Input Schema

{
  "type": "object",
  "properties": {
    "venue_name": {
      "type": "string"
    },
    "venue_phone": {
      "type": "string"
    },
    "party_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 40
    },
    "date": {
      "type": "string",
      "description": "'Friday', 'tomorrow', '9/12', or '2026-09-12'. Resolved in the owner's timezone."
    },
    "time": {
      "type": "string",
      "description": "e.g. '7:30pm'. 5–11 without am/pm is treated as evening."
    },
    "name": {
      "type": "string",
      "description": "Name for the booking; defaults to the owner."
    },
    "name_spelling": {
      "type": "string",
      "description": "Letter-by-letter if unusual, e.g. 'F-A-T-H-O-L-L-A-H-I'."
    },
    "earliest": {
      "type": "string",
      "description": "Earliest acceptable time."
    },
    "latest": {
      "type": "string",
      "description": "Latest acceptable time."
    },
    "fallback_times": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "prefer": {
      "type": "string",
      "enum": [
        "earlier",
        "later",
        "closest"
      ]
    },
    "seating": {
      "type": "string",
      "enum": [
        "any",
        "indoor",
        "outdoor",
        "bar"
      ]
    },
    "occasion": {
      "type": "string"
    },
    "dietary": {
      "type": "string"
    },
    "accept_waitlist": {
      "type": "boolean",
      "default": true
    },
    "accept_next_day": {
      "type": "boolean",
      "default": false
    },
    "owner_phone_ok": {
      "type": "boolean",
      "description": "Allow giving the owner's mobile as the reservation contact (default: the line's number and email).",
      "default": false
    },
    "notes": {
      "type": "string",
      "description": "Anything else the host might ask: high chair, accessibility, corkage."
    },
    "max_minutes": {
      "type": "integer",
      "minimum": 2,
      "maximum": 10
    }
  },
  "required": [
    "venue_name",
    "venue_phone",
    "party_size",
    "date",
    "time"
  ],
  "additionalProperties": false
}
🟒list_reservations(limit)

Recent reservation requests with their status and the venue's stated policies.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 10
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒get_call(call_id)

Status, structured notes, outcome, transcript, and annotations for one call.

Input Schema

{
  "type": "object",
  "properties": {
    "call_id": {
      "type": "string"
    }
  },
  "required": [
    "call_id"
  ],
  "additionalProperties": false
}
🟒list_calls(limit)

Recent calls with summaries, newest first.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 10
    }
  },
  "required": [],
  "additionalProperties": false
}
πŸ”΄annotate_call(call_id, note)

Attach a note to a call (what you did about it, a decision, context for the owner). Shows in the dashboard next to the debrief.

Input Schema

{
  "type": "object",
  "properties": {
    "call_id": {
      "type": "string"
    },
    "note": {
      "type": "string",
      "maxLength": 4000
    }
  },
  "required": [
    "call_id",
    "note"
  ],
  "additionalProperties": false
}
πŸ”΄send_text(to, body)

Send an SMS from the line's number. Respects STOP opt-outs. Read the delivery field in the result: while CosVoice's carrier registration (10DLC) is in progress, texts from the line may be filtered by US carriers and not arrive; texts to the line and calls always work.

Input Schema

{
  "type": "object",
  "properties": {
    "to": {
      "type": "string"
    },
    "body": {
      "type": "string",
      "maxLength": 1200
    }
  },
  "required": [
    "to",
    "body"
  ],
  "additionalProperties": false
}
πŸ”΄ack_instructions(ids, all)

Mark owner instructions (texts the owner sent to the line) as handled so they stop being attached to tool results. Pass the ids from the OWNER INSTRUCTIONS notice, or all: true.

Input Schema

{
  "type": "object",
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Instruction ids to acknowledge."
    },
    "all": {
      "type": "boolean",
      "description": "Acknowledge everything pending."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒list_messages(limit)

Recent texts to and from the line.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 20
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒list_emails(limit)

Email received at and sent from the line's address, newest first (direction inbound|outbound), with forwarding status.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 20
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒get_email(email_id)

Full text of one email the line received.

Input Schema

{
  "type": "object",
  "properties": {
    "email_id": {
      "type": "string"
    }
  },
  "required": [
    "email_id"
  ],
  "additionalProperties": false
}
πŸ”΄send_email(reply_to_email_id, to, subject, body)

Send an email from the line's own address ([email protected]). Reply to a message the line received by passing reply_to_email_id (recipient and subject fill in, threading is kept), or write to the owner. The line may only email people who have emailed it first, its owner, or its Bot inbox. Plain text; keep it short and sign as the line.

Input Schema

{
  "type": "object",
  "properties": {
    "reply_to_email_id": {
      "type": "string",
      "description": "Id of a received email to reply to."
    },
    "to": {
      "type": "string",
      "description": "Recipient. Optional when replying."
    },
    "subject": {
      "type": "string",
      "maxLength": 200
    },
    "body": {
      "type": "string",
      "maxLength": 8000
    }
  },
  "required": [
    "body"
  ],
  "additionalProperties": false
}
πŸ”΄forward_email(email_id, to)

Forward one received email to one of the line's own inboxes: its forwarding, notification or Bot inbox, or the owner's sign-in address (defaults to the forwarding inbox). It cannot forward to any other address, and a new inbox must be confirmed by its owner first.

Input Schema

{
  "type": "object",
  "properties": {
    "email_id": {
      "type": "string"
    },
    "to": {
      "type": "string"
    }
  },
  "required": [
    "email_id"
  ],
  "additionalProperties": false
}
🟒list_contacts

Owner, approved, VIP, and blocked numbers.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
πŸ”΄add_contact(name, phone, role, notes)

Teach the line a number. Roles: approved (reaches the owner), vip (interrupts), blocked (polite wall).

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "enum": [
        "approved",
        "vip",
        "blocked"
      ],
      "default": "approved"
    },
    "notes": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "name",
    "phone"
  ],
  "additionalProperties": false
}
πŸ”΄remove_contact(phone)

Remove a number from the contacts list (not the owner).

Input Schema

{
  "type": "object",
  "properties": {
    "phone": {
      "type": "string"
    }
  },
  "required": [
    "phone"
  ],
  "additionalProperties": false
}
🟒get_settings

Persona, voice, greeting, standing instructions, owner, notifications, forwarding, webhook, Bot push, SMS consent.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
πŸ”΄update_settings(name, voice, greeting, instructions, owner_name, ...)

Change any of: name, voice, greeting, instructions, owner_name, owner_phone, timezone, notify_email, agent_email, morning_brief (daily digest on/off), morning_brief_hour (0–23 local), forward_email, forward_mode (relay|raw|off), sms_opt_in, answer_rings (0|1|2). Only the fields you pass change.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "voice": {
      "type": "string",
      "enum": [
        "eve",
        "ara",
        "rex",
        "sal",
        "carina",
        "celeste",
        "rigel",
        "luna",
        "lux",
        "atlas",
        "leo",
        "iris",
        "ursa",
        "lumen",
        "castor",
        "naksh",
        "perseus",
        "zenith",
        "helios",
        "kepler",
        "cosmo",
        "altair",
        "orion",
        "zagan",
        "helix",
        "sirius"
      ]
    },
    "greeting": {
      "type": "string",
      "maxLength": 300,
      "description": "What the line says first on every call it answers, including calls forwarded from the owner's mobile. Up to 300 characters. Empty restores the default."
    },
    "instructions": {
      "type": "string",
      "maxLength": 12000,
      "description": "Standing context for every call, in plain English. Up to 12,000 characters (about 2,000 words); a longer text is refused with an error, never trimmed."
    },
    "owner_name": {
      "type": "string"
    },
    "owner_phone": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "notify_email": {
      "type": "string"
    },
    "agent_email": {
      "type": "string"
    },
    "morning_brief": {
      "type": "boolean",
      "description": "Daily morning brief email (calls, texts, bookings, what is waiting on the owner). Default on."
    },
    "morning_brief_hour": {
      "type": "integer",
      "minimum": 0,
      "maximum": 23,
      "description": "Local hour for the brief. Default 7."
    },
    "forward_email": {
      "type": "string"
    },
    "forward_mode": {
      "type": "string",
      "enum": [
        "relay",
        "raw",
        "off"
      ]
    },
    "sms_opt_in": {
      "type": "boolean"
    },
    "plan": {
      "type": "string",
      "enum": [
        "starter",
        "plus",
        "pro"
      ],
      "description": "Not changeable here. A plan change alters what the owner's card is charged, so the owner does it under Settings, Plan. Sending a different plan returns an error with that link."
    },
    "voice_style": {
      "type": "string",
      "enum": [
        "warm",
        "brisk",
        "formal",
        "playful"
      ],
      "description": "How the line carries itself on calls."
    },
    "voice_speed": {
      "type": "number",
      "minimum": 0.8,
      "maximum": 1.2,
      "description": "Speaking speed; 1.0 is natural."
    },
    "answer_rings": {
      "type": "integer",
      "enum": [
        0,
        1,
        2
      ],
      "description": "When the line picks up an inbound call: 0 right away, 1 at the end of the first ring (default), 2 after two rings. Forwarded missed calls always answer right away."
    },
    "pronunciations": {
      "type": "array",
      "maxItems": 20,
      "items": {
        "type": "object",
        "properties": {
          "word": {
            "type": "string"
          },
          "sayAs": {
            "type": "string"
          }
        },
        "required": [
          "word",
          "sayAs"
        ]
      },
      "description": "How to say names, e.g. { word: 'Fathollahi', sayAs: 'fat-oh-LAH-hee' }."
    }
  },
  "required": [],
  "additionalProperties": false
}
πŸ”΄set_bot_push(url, key, events)

Have CosVoice start YOU the moment something arrives, instead of you polling. Give it the webhook URL and key of a routine of yours that has a Webhook trigger (Grok Bot: Routines β†’ New β†’ trigger Webhook; the URL and a crsr_ key appear). CosVoice POSTs a JSON body with what_to_do plus the ids when the owner texts an instruction, an email arrives, or a call finishes; that body becomes the routine's input. Pass an empty url to turn it off. events limits which moments wake you (default all three).

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    },
    "key": {
      "type": "string",
      "description": "Bearer key for that URL (for Grok, the crsr_… key shown with the webhook)."
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "instruction",
          "email",
          "call"
        ]
      }
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false
}
πŸ”΄set_webhook(url)

Set (or clear with an empty url) the HTTPS webhook that receives call.completed, message.received, and email.received. Returns the signing secret once.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false
}
🟒list_history(type, query, limit, format)

Unified history of calls, texts, and email with optional search. The same table as the dashboard.

Input Schema

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "all",
        "call",
        "message",
        "email"
      ]
    },
    "query": {
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50
    },
    "format": {
      "type": "string",
      "enum": [
        "json",
        "csv"
      ]
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒recent_activity(since)

Everything since a timestamp: calls, texts, emails. Catch-up when webhooks were missed.

Input Schema

{
  "type": "object",
  "properties": {
    "since": {
      "type": "string"
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒list_integrations

Partner integrations available through this line (groceries, food, reservations, travel…), with status and connect links. Partner tools appear as <partner>__<tool>.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded27 tools
verifiedversion not recorded27 tools
auth requiredversion not recordedβ€”
auth requiredversion not recordedβ€”
auth requiredversion not recordedβ€”
auth requiredversion not recordedβ€”